summaryrefslogtreecommitdiffstats
path: root/src/util
diff options
context:
space:
mode:
authorKen Raeburn <raeburn@mit.edu>2005-10-04 23:38:37 +0000
committerKen Raeburn <raeburn@mit.edu>2005-10-04 23:38:37 +0000
commit745cddfcd791359ff5ae5c2f33db3b196f6df481 (patch)
tree4a5081d158f5f0e3ec784b1c2190d9870dceaa41 /src/util
parenta6759444a5cc94637576e92cf425efda13a791ea (diff)
downloadkrb5-745cddfcd791359ff5ae5c2f33db3b196f6df481.tar.gz
krb5-745cddfcd791359ff5ae5c2f33db3b196f6df481.tar.xz
krb5-745cddfcd791359ff5ae5c2f33db3b196f6df481.zip
Move the db2 library to the site of its one use, the kdb-db2 module.
Update configuration scripts, pathname make variables, etc., accordingly. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@17407 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/util')
-rw-r--r--src/util/ChangeLog6
-rw-r--r--src/util/Makefile.in4
-rw-r--r--src/util/db2/CHANGELOG.db2123
-rw-r--r--src/util/db2/ChangeLog484
-rw-r--r--src/util/db2/Makefile.in41
-rw-r--r--src/util/db2/Makefile.inc10
-rw-r--r--src/util/db2/README17
-rw-r--r--src/util/db2/README.NOT.SLEEPYCAT.DB2
-rw-r--r--src/util/db2/README.db241
-rw-r--r--src/util/db2/btree/Makefile.in14
-rw-r--r--src/util/db2/btree/Makefile.inc7
-rw-r--r--src/util/db2/btree/bt_close.c183
-rw-r--r--src/util/db2/btree/bt_conv.c221
-rw-r--r--src/util/db2/btree/bt_debug.c377
-rw-r--r--src/util/db2/btree/bt_delete.c657
-rw-r--r--src/util/db2/btree/bt_get.c105
-rw-r--r--src/util/db2/btree/bt_open.c476
-rw-r--r--src/util/db2/btree/bt_overflow.c228
-rw-r--r--src/util/db2/btree/bt_page.c100
-rw-r--r--src/util/db2/btree/bt_put.c328
-rw-r--r--src/util/db2/btree/bt_search.c297
-rw-r--r--src/util/db2/btree/bt_seq.c901
-rw-r--r--src/util/db2/btree/bt_split.c828
-rw-r--r--src/util/db2/btree/bt_utils.c260
-rw-r--r--src/util/db2/btree/btree.h383
-rw-r--r--src/util/db2/btree/extern.h110
-rw-r--r--src/util/db2/clib/Makefile.in11
-rw-r--r--src/util/db2/clib/memmove.c142
-rw-r--r--src/util/db2/clib/mkstemp.c126
-rw-r--r--src/util/db2/clib/strerror.c71
-rw-r--r--src/util/db2/configure.in96
-rw-r--r--src/util/db2/db/Makefile.in11
-rw-r--r--src/util/db2/db/Makefile.inc5
-rw-r--r--src/util/db2/db/db.c99
-rw-r--r--src/util/db2/docs/btree.3.ps366
-rw-r--r--src/util/db2/docs/dbopen.3.ps508
-rw-r--r--src/util/db2/docs/hash.3.ps292
-rw-r--r--src/util/db2/docs/hash.usenix.ps12209
-rw-r--r--src/util/db2/docs/libtp.usenix.ps12340
-rw-r--r--src/util/db2/docs/mpool.3.ps320
-rw-r--r--src/util/db2/docs/recno.3.ps341
-rw-r--r--src/util/db2/hash/Makefile.in13
-rw-r--r--src/util/db2/hash/Makefile.inc6
-rw-r--r--src/util/db2/hash/dbm.c356
-rw-r--r--src/util/db2/hash/extern.h109
-rw-r--r--src/util/db2/hash/hash.c1068
-rw-r--r--src/util/db2/hash/hash.c.patch109
-rw-r--r--src/util/db2/hash/hash.h196
-rw-r--r--src/util/db2/hash/hash_bigkey.c483
-rw-r--r--src/util/db2/hash/hash_debug.c105
-rw-r--r--src/util/db2/hash/hash_func.c201
-rw-r--r--src/util/db2/hash/hash_log2.c55
-rw-r--r--src/util/db2/hash/hash_page.c1387
-rw-r--r--src/util/db2/hash/hsearch.c107
-rw-r--r--src/util/db2/hash/page.h178
-rw-r--r--src/util/db2/hash/page.h.patch42
-rw-r--r--src/util/db2/hash/search.h55
-rw-r--r--src/util/db2/include/ChangeLog74
-rw-r--r--src/util/db2/include/db-config.h.in16
-rw-r--r--src/util/db2/include/db-dbm.h23
-rw-r--r--src/util/db2/include/db-int.h283
-rw-r--r--src/util/db2/include/db-ndbm.h91
-rw-r--r--src/util/db2/include/db-queue.h245
-rw-r--r--src/util/db2/include/db.h175
-rw-r--r--src/util/db2/libdb.exports99
-rw-r--r--src/util/db2/man/Makefile.inc7
-rw-r--r--src/util/db2/man/db.man.ps2295
-rw-r--r--src/util/db2/man/db_btree.3246
-rw-r--r--src/util/db2/man/db_hash.3138
-rw-r--r--src/util/db2/man/db_lock.3462
-rw-r--r--src/util/db2/man/db_log.3290
-rw-r--r--src/util/db2/man/db_mpool.3403
-rw-r--r--src/util/db2/man/db_open.3574
-rw-r--r--src/util/db2/man/db_recno.3268
-rw-r--r--src/util/db2/man/db_txn.3373
-rw-r--r--src/util/db2/man/spell.ok170
-rw-r--r--src/util/db2/mpool/Makefile.in11
-rw-r--r--src/util/db2/mpool/Makefile.inc5
-rw-r--r--src/util/db2/mpool/README7
-rw-r--r--src/util/db2/mpool/mpool.c514
-rw-r--r--src/util/db2/mpool/mpool.h117
-rw-r--r--src/util/db2/recno/Makefile.in13
-rw-r--r--src/util/db2/recno/Makefile.inc6
-rw-r--r--src/util/db2/recno/extern.h72
-rw-r--r--src/util/db2/recno/rec_close.c187
-rw-r--r--src/util/db2/recno/rec_delete.c197
-rw-r--r--src/util/db2/recno/rec_get.c311
-rw-r--r--src/util/db2/recno/rec_open.c243
-rw-r--r--src/util/db2/recno/rec_put.c280
-rw-r--r--src/util/db2/recno/rec_search.c126
-rw-r--r--src/util/db2/recno/rec_seq.c131
-rw-r--r--src/util/db2/recno/rec_utils.c122
-rw-r--r--src/util/db2/recno/recno.h39
-rw-r--r--src/util/db2/test/ChangeLog74
-rw-r--r--src/util/db2/test/Makefile.in33
-rw-r--r--src/util/db2/test/README74
-rw-r--r--src/util/db2/test/SEQ_TEST/data8
-rw-r--r--src/util/db2/test/SEQ_TEST/mbox399
-rw-r--r--src/util/db2/test/SEQ_TEST/t.c85
-rw-r--r--src/util/db2/test/btree.tests/ChangeLog17
-rw-r--r--src/util/db2/test/btree.tests/main.c832
-rw-r--r--src/util/db2/test/dbtest.c768
-rw-r--r--src/util/db2/test/dictionary308
-rw-r--r--src/util/db2/test/hash1.tests/Makefile43
-rw-r--r--src/util/db2/test/hash1.tests/driver2.c114
-rw-r--r--src/util/db2/test/hash1.tests/makedb.sh13
-rw-r--r--src/util/db2/test/hash1.tests/tcreat3.c105
-rw-r--r--src/util/db2/test/hash1.tests/tdel.c122
-rw-r--r--src/util/db2/test/hash1.tests/testit154
-rw-r--r--src/util/db2/test/hash1.tests/thash4.c131
-rw-r--r--src/util/db2/test/hash1.tests/tread2.c105
-rw-r--r--src/util/db2/test/hash1.tests/tseq.c88
-rw-r--r--src/util/db2/test/hash1.tests/tverify.c107
-rw-r--r--src/util/db2/test/hash2.tests/README72
-rw-r--r--src/util/db2/test/hash2.tests/bigtest.c76
-rw-r--r--src/util/db2/test/hash2.tests/passtest.c184
-rw-r--r--src/util/db2/test/hash2.tests/passwd/genpass.c23
-rw-r--r--src/util/db2/test/run.test746
118 files changed, 7 insertions, 50897 deletions
diff --git a/src/util/ChangeLog b/src/util/ChangeLog
index 47761a1098..56872aeac9 100644
--- a/src/util/ChangeLog
+++ b/src/util/ChangeLog
@@ -1,3 +1,9 @@
+2005-10-04 Ken Raeburn <raeburn@mit.edu>
+
+ * db2: Directory moved to modules/kdb/db2/libdb2.
+ * Makefile.in (LOCAL_SUBDIRS): Don't reference it.
+ (MAYBE_DB_k5, MAYBE_DB_sys): Variables deleted.
+
2005-09-08 Tom Yu <tlyu@mit.edu>
* mkrel: Update for svn.
diff --git a/src/util/Makefile.in b/src/util/Makefile.in
index ecad6b2b82..c9fd1d8ce6 100644
--- a/src/util/Makefile.in
+++ b/src/util/Makefile.in
@@ -7,16 +7,14 @@ mydir=util
##WIN32### below in the 'all-windows' target anyways, so just hide this.
##WIN32##!if 0
LOCAL_SUBDIRS=support $(MAYBE_ET_@COM_ERR_VERSION@) $(MAYBE_SS_@SS_VERSION@) \
- profile pty $(MAYBE_DB_@DB_VERSION@) send-pr
+ profile pty send-pr
##WIN32##!endif
BUILDTOP=$(REL)..
MAYBE_ET_k5 = et
MAYBE_SS_k5 = ss
-MAYBE_DB_k5 = db2
MAYBE_ET_sys =
MAYBE_SS_sys =
-MAYBE_DB_sys =
editsh = sed -e 's,@''ARADD''@,$(ARADD),g' -e 's,@''ARCHIVE''@,$(ARCHIVE),g'
HOST_TYPE=@HOST_TYPE@
diff --git a/src/util/db2/CHANGELOG.db2 b/src/util/db2/CHANGELOG.db2
deleted file mode 100644
index abd05f95d4..0000000000
--- a/src/util/db2/CHANGELOG.db2
+++ /dev/null
@@ -1,123 +0,0 @@
-db2-alpha.0 -> db2-alpha.1
- This fixes a number of bugs in the alpha release.
- 1. 64-bit functionality. The test suite now runs on alphas.
- Memory leak fixed.
- Pairs no longer disappear when pages are exactly full.
- Flush meta-data correctly on sync.
-1.86 -> db2-alpha.0
- This is an interim release. We are in the process of
- adding logging, locking, and transaction support to all
- the db access methods. This will necessitate database
- format changes, interface changes, and major upheaval.
- In the meantime, this PRELIMINARY release is to correct
- some known bugs in the hash pacakge. This release uses
- a different page format from 1.86, so you will need to
- dump and reload any existing databases if you upgrade
- to this (and may have to do it again when 2.0 becomes
- available.
-1.85 -> 1.86
- btree: Fix to split code for single large record at the end of a
- page.
-1.84 -> 1.85
- recno: #ifdef out use of mmap, it's not portable enough.
-
-1.83 -> 1.84 Thu Aug 18 15:46:07 EDT 1994
- recno: Rework fixed-length records so that closing and reopening
- the file now works. Pad short records on input. Never do
- signed comparison in recno input reading functions.
-
-1.82 -> 1.83 Tue Jul 26 15:33:44 EDT 1994
- btree: Rework cursor deletion code yet again; bugs with
- deleting empty pages that only contained the cursor
- record.
-
-1.81 -> 1.82 Sat Jul 16 11:01:50 EDT 1994
- btree: Fix bugs introduced by new cursor/deletion code.
- Replace return kbuf/dbuf with real DBT's.
-
-1.80 -> 1.81
- btree: Fix bugs introduced by new cursor/deletion code.
- all: Add #defines for Purify.
-
-1.79 -> 1.80 Wed Jul 13 22:41:54 EDT 1994
- btree Change deletion to coalesce empty pages. This is a major
- change, cursors and duplicate pages all had to be reworked.
- Return to a fixed stack.
- recno: Affected by cursor changes. New cursor structures should
- permit multiple cursors in the future.
-
-1.78 -> 1.79 Mon Jun 20 17:36:47 EDT 1994
- all: Minor cleanups of 1.78 for porting reasons; only
- major change was inlining check of NULL pointer
- so that __fix_realloc goes away.
-
-1.77 -> 1.78 Thu Jun 16 19:06:43 EDT 1994
- all: Move "standard" size typedef's into db.h.
-
-1.76 -> 1.77 Thu Jun 16 16:48:38 EDT 1994
- hash: Delete __init_ routine, has special meaning to OSF 2.0.
-
-1.74 -> 1.76
- all: Finish up the port to the Alpha.
-
-1.73 -> 1.74
- recno: Don't put the record if rec_search fails, in rec_rdelete.
- Create fixed-length intermediate records past "end" of DB
- correctly.
- Realloc bug when reading in fixed records.
- all: First cut at port to Alpha (64-bit architecture) using
- 4.4BSD basic integral types typedef's.
- Cast allocation pointers to shut up old compilers.
- Rework PORT directory into OS/machine directories.
-
-1.72 -> 1.73
- btree: If enough duplicate records were inserted and then deleted
- that internal pages had references to empty pages of the
- duplicate keys, the search function ended up on the wrong
- page.
-
-1.7 -> 1.72 12 Oct 1993
- hash: Support NET/2 hash formats.
-
-1.7 -> 1.71 16 Sep 1993
- btree/recno:
- Fix bug in internal search routines that caused
- return of invalid pointers.
-
-1.6 -> 1.7 07 Sep 1993
- hash: Fixed big key overflow bugs.
- test: Portability hacks, rewrite test script, Makefile.
- btree/recno:
- Stop copying non-overflow key/data pairs.
- PORT: Break PORT directory up into per architecture/OS
- subdirectories.
-
-1.5 -> 1.6 06 Jun 1993
- hash: In PAIRFITS, the first comparison should look at (P)[2].
- The hash_realloc function was walking off the end of memory.
- The overflow page number was wrong when bumping splitpoint.
-
-1.4 -> 1.5 23 May 1993
- hash: Set hash default fill factor dynamically.
- recno: Fixed bug in sorted page splits.
- Add page size parameter support.
- Allow recno to specify the name of the underlying btree;
- used for vi recovery.
- btree/recno:
- Support 64K pages.
- btree/hash/recno:
- Provide access to an underlying file descriptor.
- Change sync routines to take a flag argument, recno
- uses this to sync out the underlying btree.
-
-1.3 -> 1.4 10 May 1993
- recno: Delete the R_CURSORLOG flag from the recno interface.
- Zero-length record fix for non-mmap reads.
- Try and make SIZE_T_MAX test in open portable.
-
-1.2 -> 1.3 01 May 1993
- btree: Ignore user byte-order setting when reading already
- existing database. Fixes to byte-order conversions.
-
-1.1 -> 1.2 15 Apr 1993
- No bug fixes, only compatibility hacks.
diff --git a/src/util/db2/ChangeLog b/src/util/db2/ChangeLog
deleted file mode 100644
index 83fe66af49..0000000000
--- a/src/util/db2/ChangeLog
+++ /dev/null
@@ -1,484 +0,0 @@
-2005-08-20 Ken Raeburn <raeburn@mit.edu>
-
- * configure.in: Use K5_AC_INIT instead of AC_INIT.
-
-2004-06-15 Ken Raeburn <raeburn@mit.edu>
-
- * mpool/mpool.c (mpool_get, mpool_write): Check that the offset
- calculation didn't overflow.
-
-2004-06-11 Ken Raeburn <raeburn@mit.edu>
-
- * Makefile.in (include/generated.stmp): New intermediate target
- file, to prevent repeated generation of unchanging header files.
- (include/config.h, include/db-config.h): Depend on it.
- ($(srcdir)/include/autoconf.stmp, $(srcdir)/include/config.h.in):
- Likewise.
- (clean-includes): Delete the new intermediate target files.
- * configure.in: Generate include/generated.stmp when config.status
- is run.
-
-2004-06-08 Ken Raeburn <raeburn@mit.edu>
-
- * Makefile.in ($(srcdir)/include/config.h.in): Always use
- --include, never try --localdir.
-
-2004-06-04 Ken Raeburn <raeburn@mit.edu>
-
- * Makefile.in (LIBBASE): Renamed from LIB.
-
-2004-05-23 Ken Raeburn <raeburn@mit.edu>
-
- * configure.in: Check for sys/param.h too.
-
-2004-05-07 Ken Raeburn <raeburn@mit.edu>
-
- * configure.in: Check for machine/endian.h too.
-
-2004-05-05 Ken Raeburn <raeburn@mit.edu>
-
- * Makefile.in (all-prerecurse): Make sure headers generated by
- config.status are up to date.
- (include/config.h, $(srcdir)/include/config.h.in,
- include/db-config.h): New rules.
- * configure.in: Don't check byte order here. Check for endian.h.
-
-2004-04-22 Ken Raeburn <raeburn@mit.edu>
-
- * libdb.exports: New file.
-
-2004-04-02 Ken Raeburn <raeburn@mit.edu>
-
- * btree/bt_seq.c: Include string.h.
-
-2003-04-01 Tom Yu <tlyu@mit.edu>
-
- * Makefile.in (install-unix): Delete install-libs. We don't want
- to install our in-tree libdb.
-
-2003-01-10 Ken Raeburn <raeburn@mit.edu>
-
- * configure.in: Don't explicitly invoke AC_PROG_INSTALL.
-
- * configure.in: Use V5_AC_OUTPUT_MAKEFILE instead of
- K5_GEN_MAKEFILE and K5_AC_OUTPUT.
-
- * Makefile.in: Add AC_SUBST_FILE marker for lib_frag.
- * btree/Makefile.in, clib/Makefile.in, db/Makefile.in,
- hash/Makefile.in, mpool/Makefile.in, recno/Makefile.in: Add
- AC_SUBST_FILE marker for libobj_frag.
-
-2003-01-05 Sam Hartman <hartmans@mit.edu>
-
- * clib/mkstemp.c (_gettemp): Remove declaration of errno
-
-2002-09-05 Ken Raeburn <raeburn@mit.edu>
-
- * configure.in: Check for stdint.h and inttypes.h.
-
-2002-09-03 Ezra Peisach <epeisach@bu.edu>
-
- * acconfig.h: Remove file. All handled by configure.in now.
-
-2002-08-29 Ken Raeburn <raeburn@mit.edu>
-
- * Makefile.in, btree/Makefile.in, clib/Makefile.in,
- db/Makefile.in, hash/Makefile.in, mpool/Makefile.in,
- recno/Makefile.in: Revert $(S)=>/ change, for Windows support.
-
-2002-08-28 Tom Yu <tlyu@mit.edu>
-
- * btree/bt_split.c (bt_psplit): Correctly account for
- sizeof(indx_t) when computing space used in a page by an item.
- [patch from www.sleepycat.com]
-
-2002-08-23 Ken Raeburn <raeburn@mit.edu>
-
- * Makefile.in, btree/Makefile.in, clib/Makefile.in,
- db/Makefile.in, hash/Makefile.in, mpool/Makefile.in,
- recno/Makefile.in: Change $(S)=>/ and $(U)=>.. globally.
-
-2002-08-23 Tom Yu <tlyu@mit.edu>
-
- * Makefile.in (LIBMINOR): Bump due to addition of bt_rseq().
-
- * hash/hash_debug.c: Remove inclusion of compat.h, as we don't
- have it in our build system.
-
- * btree/extern.h: Add missing prototypes/renames for
- __bt_dmpage(). Add renames for bt_rseq() support functions.
-
- * btree/bt_seq.c (bt_rseq): New function; like __bt_seq() but does
- recursive descent rather than using the prev/next pointers. This
- will catch some pages that might be missed if the database is
- inconsistent. Added support functions for bt_rseq() as well.
-
- * btree/bt_page.c (__bt_free): Set B_METADIRTY when updating free
- list.
- (__bt_new): Set B_METADIRTY when updating free list.
- [patch from www.sleepycat.com]
-
- * btree/bt_debug.c (__bt_dump): Bound loop by number of pages
- actually in file to avoid getting a nigh-infinite number of
- all-zeroes pages.
- (__bt_dmpage): Print a newline after dumping the meta page.
- (__bt_dpage): Add DB* parameter; use this to get pagesize in order
- to limit dumping of page contents, in case NEXTINDEX(h) happens to
- be bogus.
- (__bt_stat): Bound loop by number of pages actually in file so as
- to stop counting pages after the actual end of file.
-
- * btree/bt_close.c (__bt_sync): Apply a Kerbnet fix from long ago;
- don't return prematurely when B_METADIRTY is set but B_MODIFIED is
- clear.
-
-2002-08-14 Ken Raeburn <raeburn@mit.edu>
-
- * Makefile.in (SUBDIROBJLISTS): New variable.
-
-2002-01-03 Ken Raeburn <raeburn@mit.edu>
-
- * btree/bt_put.c (__bt_put): Correctly handle writing out the key
- or data size on a big-endian 64-bit platform.
-
-2001-10-24 Ezra Peisach <epeisach@mit.edu>
-
- * configure.in: Add optional argument to AC_DEFINE to provide
- comment in generated header file.
-
- * acconfig.h: Remove int32_t and u_int32_t, handled by configure.in
-
-2001-07-08 Ezra Peisach <epeisach@mit.edu>
-
- * hash/hash_func.c (hash4): Declare first argument const.
-
- * hash/hash.h: struct HTAB fname element now const.
-
- * hash/hash.c: Declare third argument to hash_access and init_hash
- const.
-
-2001-07-06 Ezra Peisach <epeisach@mit.edu>
-
- * hash/dbm.c: Include db-dbm.h for prototypes.
-
-2001-07-04 Ezra Peisach <epeisach@mit.edu>
-
- * hash/hash_log2.c: Include hash.h, page.h and extern.h for prototype.
-
-2001-06-21 Ezra Peisach <epeisach@mit.edu>
-
- * test/dbtest.c: Cast argument to isspace() to int. Do not shadow
- global variables type and flags.
-
- * btree/bt_search.c, btree/bt_seq.c, recno/rec_search.c: Change
- local variable index to idx.
-
-2001-06-21 Ezra Peisach <epeisach@mit.edu>
-
- * btree/bt_delete.c, btree/bt_put.c, recno/rec_delete.c,
- recno/rec_put.c: Change local variable index to idx.
-
- * hash/hash_page.c: Change local variable stat to status to
- prevent shadowing system function.
-
-2000-11-01 Ezra Peisach <epeisach@mit.edu>
-
- * configure.in (AC_COMPILE_TYPE): Declare with AC_DEFUN() instead
- of define() as newer versions of autoconf check for AC_REQUIRE use
- outside of AC_DEFUN.
-
-Thu Aug 10 23:21:01 2000 Ezra Peisach <epeisach@mit.edu>
-
- * configure.in: Add AC_PROG_INSTALL for installation of library.
-
-2000-07-04 Ezra Peisach <epeisach@mit.edu>
-
- * test/dbtest.c: Cleanup gcc -Wall complaints with printf format
- strings.
-
-2000-07-02 Ezra Peisach <epeisach@engrailed.mit.edu>
-
- * recno/rec_seq.c: Include unused sccsid when LIBC_SCCS defined.
-
- * recno/rec_close.c (__rec_close): Explicit braces to avoid
- ambiguous `else'
-
- * btree/bt_split.c (bt_psplit): Parenthesis about && and ||
- conditional.
-
- * btree/bt_put.c (__bt_put): Extra {} to make nested if/else
- unambiguous.
-
- * btree/bt_open.c (__bt_open): Add parenthesis to ensure
- precedence ordering.
-
- * hash/dbm.c (kdb2_dbm_firstkey): Conditionalize defintion of
- variables based on use.
-
- * hash/hash_func.c: Ifdef out unused static hash functions.
-
- * hash/hash.c (init_htab): Remove unused variable.
-
-2000-07-01 Tom Yu <tlyu@mit.edu>
-
- * clib/strerror.c: #include config.h.
-
- * clib/mkstemp.c: #include config.h.
-
- * clib/memmove.c: #include config.h.
-
- * clib/Makefile.in (LOCALINCLUDES): Add -I../include to get
- config.h.
-
- * configure.in: Generate two config headers, one for internal use
- and one for external use. Rework clib replacement code to use
- AC_DEFINE rather than ADD_DEF.
-
- * Makefile.in (STOBJLISTS): Add clib.
-
-2000-06-30 Tom Yu <tlyu@mit.edu>
-
- * configure.in: Rework to use krb5 build system.
-
- * Makefile.in: Rework to use krb5 build system.
-
- * btree/Makefile.in: New file.
-
- * clib/Makefile.in: New file.
-
- * db/Makefile.in: New file.
-
- * mpool/Makefile.in: New file.
-
- * recno/Makefile.in: New file.
-
- * test/Makefile.in: New file.
-
-2000-06-26 Ken Raeburn <raeburn@mit.edu>
-
- * btree/bt_put.c (__bt_put): Initialize "e".
-
-2000-05-01 Nalin Dahyabhai <nalin@redhat.com>
-
- * hash/dbm.c (kdb2_dbm_open): Don't overflow buffer "path".
-
-1999-08-15 Tom Yu <tlyu@mit.edu>
-
- * README.NOT.SLEEPYCAT.DB: New file; pointer to README to
- hopefully unconfuse people.
-
- * README: Add notice to the effect that this is not Berkeley or
- Sleepycat DB.
-
- * README.db2: Renamed from README.
-
-Fri Feb 13 14:37:47 1998 Tom Yu <tlyu@mit.edu>
-
- * recno/extern.h: Additional renaming.
-
- * hash/extern.h: Additional renaming.
-
- * hash/hash_page.c (page_to_oaddr):
- (is_bitmap_pgno): Declare static to avoid leaking symbols.
-
- * hash/search.h: Additional renaming.
-
- * hash/hash_log2.c (__log2): Rename explicitly.
-
- * mpool/mpool.h: Additional renaming.
-
- * btree/extern.h: Additional renaming.
-
- * hash/hash.c (__kdb2_hash_open): Rename to avoid potential
- collision with NetBSD libc.
-
- * hash/dbm.c: Rename lots of functions to avoid colliding with
- native dbm implementations.
-
- * db/db.c (kdb2_dbopen): Rename to avoid colliding with NetBSD
- libc.
-
-Wed Jan 21 10:17:34 1998 Ezra Peisach <epeisach@mit.edu>
-
- * btree/bt_open.c: Added O_BINARY for __CYGWIN32__.
- * clib/mkstemp.c: Added O_BINARY for __CYGWIN32__.
- * db/db.c: Added O_BINARY for __CYGWIN32__.
- * hash/dbm.c: Added O_BINARY for __CYGWIN32__.
- * hash/hash.c: Added O_BINARY for __CYGWIN32__.
- * hash/hsearch.c: Added O_BINARY for __CYGWIN32__.
- * include/db-int.h: Added O_BINARY for __CYGWIN32__.
- * recno/rec_open.c: Added O_BINARY for __CYGWIN32__.
- * test/dbtest.c: Added O_BINARY for __CYGWIN32__.
- * test/SEQ_TEST/t.c: Added O_BINARY for __CYGWIN32__.
- * test/btree.tests/main.c: Added O_BINARY for __CYGWIN32__.
- * test/hash1.tests/driver2.c: Added O_BINARY for __CYGWIN32__.
- * test/hash1.tests/tcreat3.c: Added O_BINARY for __CYGWIN32__.
- * test/hash1.tests/tdel.c: Added O_BINARY for __CYGWIN32__.
- * test/hash1.tests/thash4.c: Added O_BINARY for __CYGWIN32__.
- * test/hash1.tests/tread2.c: Added O_BINARY for __CYGWIN32__.
- * test/hash1.tests/tseq.c: Added O_BINARY for __CYGWIN32__.
- * test/hash1.tests/tverify.c: Added O_BINARY for __CYGWIN32__.
- * test/hash2.tests/bigtest.c: Added O_BINARY for __CYGWIN32__.
- * test/hash2.tests/passtest.c: Added O_BINARY for __CYGWIN32__.
- Changes originally by Jeremy Allison (jra@cygnus.com)
-
-Thu Jan 15 11:34:13 1998 Ezra Peisach <epeisach@mit.edu>
-
- * hash/hash_bigkey.c (collect_key, collect_data): Cast malloc
- return value to correct types. (raeburn@cygnus.com)
-
- * obj/Makefile.in (check): Set srcdir in environment.
- (raeburn@cygnus.com)
-
- * configure.in (AC_COMPILE_TYPE): replacment for AC_CHECK_TYPE
- that uses AC_TRY_COMPILE instead of AC_EGREP_CPP. For now, only
- use it for the int32 types (where AC_CHECK_TYPE gets the wrong
- result on __CYGWIN32__) and plan that AC_CHECK_TYPE itself gets
- repaired. (Fix by eichin@cygnus.com)
-
-
-Sun Dec 21 18:33:14 1997 Tom Yu <tlyu@mit.edu>
-
- * hash/dbm.c: Rename the errno member of HTAB.
-
- * hash/hash.h: Rename the errno member of HTAB to local_errno to
- avoid a collision with a glibc macro.
-
- * hash/hash.c: Rename the errno member of HTAB to local_errno to
- avoid a collision with a glibc macro.
-
-Mon Nov 11 17:01:29 1996 Mark Eichin <eichin@cygnus.com>
-
- * db2: overflow_page fixes, __P redef
- * db2 tests: better alternate dictionary support
-
- Tue Oct 8 22:55:01 1996 Mark W. Eichin <eichin@cygnus.com>
-
- * hash/hash.h (DEF_BUCKET_SIZE, DEF_SEGSIZE): now derived from
- DEF_BUCKET_SHIFT and DEF_SEGSIZE_SHIFT respectively, for
- consistency.
-
- Tue Oct 8 22:43:26 1996 Mark W. Eichin <eichin@cygnus.com>
-
- * hash/hash_page.c (__add_ovflpage, __add_bigpage): overflow_page
- can return a 0 indicating a failure -- callers must check it
- instead of corrupting the database.
- (overflow_page): document apparent error return.
-
- Fri Aug 30 20:05:57 1996 Ken Raeburn <raeburn@cygnus.com>
-
- * test/dictionary: New file, list of garbage words.
- * test/run.test (main): Use it if no other dictionary can be
- found. Set dictsize with size of dictionary.
- (test12, test20): Skip if dictionary is too small.
-
-Wed Aug 28 17:25:10 1996 Tom Yu <tlyu@mit.edu>
-
- * configure.in: Add check for SIZEOF_INT.
-
- * include/db.h: Check SIZEOF_INT rather than UINT_MAX; it's broken
- under Ultrix.
-
-Thu Aug 22 23:13:32 1996 Ezra Peisach <epeisach@mit.edu>
-
- * Makefile.in: Add dummy rule for Makefiles.
-
-Wed Jul 31 03:35:47 1996 Tom Yu <tlyu@mit.edu>
-
- * obj/Makefile.in: Add -Dfoo=my_foo when compiling replacement
- functions (so that the redefinitions in db-int.h take
- effect).
-
-Mon Jul 29 23:24:22 1996 Tom Yu <tlyu@mit.edu>
-
- * hash/hash.c, hash/hash_func.c, hash/hash_page.c: Add "static" to
- some function defn's that need them; they were prototyped
- as static but not defined as static.
-
-Fri Jul 26 00:41:45 1996 Theodore Y. Ts'o <tytso@mit.edu>
-
- * Makefile.in (install): Add a blank install target to keep the
- top-level "make install" happy.
-
-Tue Jul 23 16:08:43 1996 Ezra Peisach <epeisach@mit.edu>
-
- * hash/dbm.c: Copy elements from the datum to an internal
- DBT. Handles case of differences in size of size fields.
-
-Fri Jun 21 00:07:57 1996 Marc Horowitz <marc@mit.edu>
-
- * hash/dbm.c (delete, store): dbm_rdonly() doesn't exist on some
- systems. In addition, the handle is really a DB handle, so it
- would break if it did exist. Remove calls to it.
-
-Wed Apr 10 21:39:54 1996 Marc Horowitz <marc@mit.edu>
-
- * hash/hash_page.c (__addel): It is possible to damage a page if a
- bigpair is added and there's not enough room. Check to make sure
- there's enough room before adding anything.
-
- * hash/hash.c (hdestroy, cursor_delete): there were still a few
- things in the hashp which weren't being freed, causing a small
- memory leak.
-
-Sun Apr 7 01:40:54 1996 Marc Horowitz <marc@mit.edu>
-
- * clib/mk{,s}temp.c: renamed to accurately reflect the function
- being provided (ultrix 4.2 has one, but not the other).
-
- * [way too many files to list here]: rename pgno_t to db_pgno_t,
- since this symbol is defined in <sys/types> on at least one OS to
- a non-compatible type (irix 5.2 defines it as long; db wants it to
- be u_int32_t).
-
- * hash/dbm.c, include/db-ndbm.h: use and reference the compat
- ndbm.h file
-
- * btree/bt_open.c, hash/hash.c, hash/hash_page.c,
- include/db-int.h, include/db.h: build fixes - use configure to set
- db internal cpp symbols for endianness stuff, move __P definition
- from db-int.h to db.h.
-
- * configure.in, acconfig.h, Makefile.in, obj/configure.in,
- obj/acconfig.in, obj/Makefile.in: rearrange the configure inputs
- to deal properly with configure at the top level, and with a
- multiarchitecture build using VPATH
-
-Sat Apr 6 16:43:26 1996 Marc Horowitz <marc@mit.edu>
-
- * obj/Makefile.in: random cleanup
-
- * btree/*.c db/db.c hash/*.c mpool/mpool.c recno/*.c
- test/SEQ_TEST/t.c test/dbtest.c test/*/*.c: use "db-int.h" instead
- of "db.h".
-
- * include/db.h, include/db-int.h: rototilled to be portable and
- sensible, using configure whenever possible.
-
- * btree/*.c db/db.c hash/*.c mpool/mpool.c recno/*.c
- test/SEQ_TEST/t.c test/dbtest.c test/*/*.c: use "db.h" instead of
- <db.h>.
-
- * hash/hash.h, btree/btree.h, mpool/mpool.c: #include "mpool.h"
- instead of <mpool.h>.
-
- * test/hash1.tests/thash4.c: remove unused and nonportable
- <sys/timeb.h>
-
- * test/hash2.tests/bigtest.c: replace <malloc.h> with <stdlib.h>
-
- * clib/memmove.c: remove <sys/cdefs.h>
-
- * mpool/mpool.c, mpool/mpool.h, hash/hash.h, include/db-queue.h:
- include "db-queue.h" instead of <sys/queue.h>, since it's not part
- of any OS standard.
-
- * obj/*: first attempt at autoconfiscation
-
- * test/hash1.tests/driver2.c (main), test/hash1.tests/tseq.c
- (main): replace berkeley memoryisms with ansi ones.
-
- * btree/bt_open.c (tmp): use sprintf instead of snprintf().
- conditionalize signal stuff on SIG_BLOCK instead of using special
- magic in a header file.
-
diff --git a/src/util/db2/Makefile.in b/src/util/db2/Makefile.in
deleted file mode 100644
index 37542aee45..0000000000
--- a/src/util/db2/Makefile.in
+++ /dev/null
@@ -1,41 +0,0 @@
-thisconfigdir=.
-myfulldir=util/db2
-mydir=.
-BUILDTOP=$(REL)..$(S)..
-LOCAL_SUBDIRS=hash btree db mpool recno clib test
-
-LIBBASE=db
-LIBMAJOR=1
-LIBMINOR=1
-STOBJLISTS=hash/OBJS.ST btree/OBJS.ST db/OBJS.ST mpool/OBJS.ST \
- recno/OBJS.ST clib/OBJS.ST
-SUBDIROBJLISTS=$(STOBJLISTS)
-RELDIR=../util/db2
-
-HDRDIR=$(BUILDTOP)/include
-HDRS = $(HDRDIR)/db.h $(HDRDIR)/db-config.h $(HDRDIR)/db-ndbm.h
-
-all-unix:: all-liblinks includes
-all-prerecurse: include/config.h include/db-config.h
-clean-unix:: clean-liblinks clean-libs clean-includes
-
-includes:: $(HDRS)
-
-$(HDRDIR)/db.h: $(srcdir)/include/db.h
- $(CP) $(srcdir)/include/db.h $@
-$(HDRDIR)/db-config.h: include/db-config.h
- $(CP) include/db-config.h $@
-$(HDRDIR)/db-ndbm.h: $(srcdir)/include/db-ndbm.h
- $(CP) $(srcdir)/include/db-ndbm.h $@
-
-include/config.h include/db-config.h: include/generated.stmp
-include/generated.stmp: $(srcdir)/include/config.h.in $(srcdir)/include/db-config.h.in
- cd $(thisconfigdir) && $(SHELL) config.status
-$(srcdir)/include/config.h.in: @MAINT@ $(srcdir)/include/autoconf.stmp
-$(srcdir)/include/autoconf.stmp: $(srcdir)/configure.in $(SRCTOP)/aclocal.m4
- cd $(srcdir) && $(AUTOHEADER) --include=$(CONFIG_RELTOPDIR) $(AUTOHEADERFLAGS)
- touch $(srcdir)/include/autoconf.stmp
-
-clean-includes::
- $(RM) $(HDRS) include/*.stmp
-# @lib_frag@
diff --git a/src/util/db2/Makefile.inc b/src/util/db2/Makefile.inc
deleted file mode 100644
index 77af9c5123..0000000000
--- a/src/util/db2/Makefile.inc
+++ /dev/null
@@ -1,10 +0,0 @@
-# @(#)Makefile.inc 8.2 (Berkeley) 2/21/94
-#
-CFLAGS+=-D__DBINTERFACE_PRIVATE
-
-.include "${.CURDIR}/db/btree/Makefile.inc"
-.include "${.CURDIR}/db/db/Makefile.inc"
-.include "${.CURDIR}/db/hash/Makefile.inc"
-.include "${.CURDIR}/db/man/Makefile.inc"
-.include "${.CURDIR}/db/mpool/Makefile.inc"
-.include "${.CURDIR}/db/recno/Makefile.inc"
diff --git a/src/util/db2/README b/src/util/db2/README
deleted file mode 100644
index 70118bef5f..0000000000
--- a/src/util/db2/README
+++ /dev/null
@@ -1,17 +0,0 @@
- IMPORTANT NOTICE:
-
-This directory contains code of somewhat unknown origin that is
-INCOMPATIBLE with both Berkeley DB 1.85 and Sleepycat DB 2.x. Do NOT
-contact Sleepycat regarding bugs in code found here; they do not
-appreciate it. All bug reports about this code should go to the MIT
-Kerberos team via krb5-send-pr or email to krb5-bugs@mit.edu, as
-usual.
-
-It is believed that this "db" code originated from Berkeley DB 1.85
-and was further modified by Cygnus and the MIT Kerberos team. Some
-significant changes to the hash code occured at some point.
-
-The file README.db2 contains the README file provided with the
-2.0-alpha release of Berkeley/Sleepycat DB, which may contain
-marginally useful information. It is not known at this time how well
-this code matches that of the 2.0-alpha release.
diff --git a/src/util/db2/README.NOT.SLEEPYCAT.DB b/src/util/db2/README.NOT.SLEEPYCAT.DB
deleted file mode 100644
index 112454e945..0000000000
--- a/src/util/db2/README.NOT.SLEEPYCAT.DB
+++ /dev/null
@@ -1,2 +0,0 @@
-THIS IS NOT THE SLEEPYCAT DB.
-Please see the README file for more information.
diff --git a/src/util/db2/README.db2 b/src/util/db2/README.db2
deleted file mode 100644
index 5700b73932..0000000000
--- a/src/util/db2/README.db2
+++ /dev/null
@@ -1,41 +0,0 @@
-# @(#)README 8.28 (Berkeley) 11/2/95
-
-This is version 2.0-ALPHA of the Berkeley DB code.
-THIS IS A PRELIMINARY RELEASE.
-
-For information on compiling and installing this software, see the file
-PORT/README.
-
-Newer versions of this software will periodically be made available by
-anonymous ftp from ftp.cs.berkeley.edu:ucb/4bsd/db.tar.{Z,gz} and from
-ftp.harvard.edu:margo/db.tar.{Z,gz}. If you want to receive announcements
-of future releases of this software, send email to the contact address
-below.
-
-Email questions may be addressed to dbinfo@eecs.harvard.edu.
-
-============================================
-Distribution contents:
-
-README This file.
-CHANGELOG List of changes, per version.
-btree B+tree access method.
-db The db_open interface routine.
-docs Various USENIX papers, and the formatted manual pages.
-hash Extended linear hashing access method.
-lock Lock manager.
-log Log manager.
-man The unformatted manual pages.
-mpool The buffer manager support.
-mutex Mutex support.
-recno The fixed/variable length record access method.
-test Test package.
-txn Transaction support.
-
-============================================
-Debugging:
-
-If you're running a memory checker (e.g. Purify) on DB, make sure that
-you recompile it with "-DPURIFY" in the CFLAGS, first. By default,
-allocated pages are not initialized by the DB code, and they will show
-up as reads of uninitialized memory in the buffer write routines.
diff --git a/src/util/db2/btree/Makefile.in b/src/util/db2/btree/Makefile.in
deleted file mode 100644
index d3b02652a6..0000000000
--- a/src/util/db2/btree/Makefile.in
+++ /dev/null
@@ -1,14 +0,0 @@
-thisconfigdir=./..
-myfulldir=util/db2/btree
-mydir=btree
-BUILDTOP=$(REL)..$(S)..$(S)..
-STLIBOBJS= bt_close.o bt_conv.o bt_debug.o bt_delete.o bt_get.o \
- bt_open.o bt_overflow.o bt_page.o bt_put.o bt_search.o \
- bt_seq.o bt_split.o bt_utils.o
-
-LOCALINCLUDES= -I. -I$(srcdir)/../include -I../include -I$(srcdir)/../mpool \
- -I$(srcdir)/../db
-
-all-unix:: all-libobjs
-clean-unix:: clean-libobjs
-# @libobj_frag@
diff --git a/src/util/db2/btree/Makefile.inc b/src/util/db2/btree/Makefile.inc
deleted file mode 100644
index 8ed76494aa..0000000000
--- a/src/util/db2/btree/Makefile.inc
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile.inc 8.2 (Berkeley) 7/14/94
-
-.PATH: ${.CURDIR}/db/btree
-
-SRCS+= bt_close.c bt_conv.c bt_debug.c bt_delete.c bt_get.c bt_open.c \
- bt_overflow.c bt_page.c bt_put.c bt_search.c bt_seq.c bt_split.c \
- bt_utils.c
diff --git a/src/util/db2/btree/bt_close.c b/src/util/db2/btree/bt_close.c
deleted file mode 100644
index 11be134113..0000000000
--- a/src/util/db2/btree/bt_close.c
+++ /dev/null
@@ -1,183 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Mike Olson.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)bt_close.c 8.7 (Berkeley) 8/17/94";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/param.h>
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "db-int.h"
-#include "btree.h"
-
-static int bt_meta __P((BTREE *));
-
-/*
- * BT_CLOSE -- Close a btree.
- *
- * Parameters:
- * dbp: pointer to access method
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS
- */
-int
-__bt_close(dbp)
- DB *dbp;
-{
- BTREE *t;
- int fd;
-
- t = dbp->internal;
-
- /* Toss any page pinned across calls. */
- if (t->bt_pinned != NULL) {
- mpool_put(t->bt_mp, t->bt_pinned, 0);
- t->bt_pinned = NULL;
- }
-
- /* Sync the tree. */
- if (__bt_sync(dbp, 0) == RET_ERROR)
- return (RET_ERROR);
-
- /* Close the memory pool. */
- if (mpool_close(t->bt_mp) == RET_ERROR)
- return (RET_ERROR);
-
- /* Free random memory. */
- if (t->bt_cursor.key.data != NULL) {
- free(t->bt_cursor.key.data);
- t->bt_cursor.key.size = 0;
- t->bt_cursor.key.data = NULL;
- }
- if (t->bt_rkey.data) {
- free(t->bt_rkey.data);
- t->bt_rkey.size = 0;
- t->bt_rkey.data = NULL;
- }
- if (t->bt_rdata.data) {
- free(t->bt_rdata.data);
- t->bt_rdata.size = 0;
- t->bt_rdata.data = NULL;
- }
-
- fd = t->bt_fd;
- free(t);
- free(dbp);
- return (close(fd) ? RET_ERROR : RET_SUCCESS);
-}
-
-/*
- * BT_SYNC -- sync the btree to disk.
- *
- * Parameters:
- * dbp: pointer to access method
- *
- * Returns:
- * RET_SUCCESS, RET_ERROR.
- */
-int
-__bt_sync(dbp, flags)
- const DB *dbp;
- u_int flags;
-{
- BTREE *t;
- int status;
-
- t = dbp->internal;
-
- /* Toss any page pinned across calls. */
- if (t->bt_pinned != NULL) {
- mpool_put(t->bt_mp, t->bt_pinned, 0);
- t->bt_pinned = NULL;
- }
-
- /* Sync doesn't currently take any flags. */
- if (flags != 0) {
- errno = EINVAL;
- return (RET_ERROR);
- }
-
- if (F_ISSET(t, B_INMEM | B_RDONLY)
- || !F_ISSET(t, B_MODIFIED | B_METADIRTY))
- return (RET_SUCCESS);
-
- if (F_ISSET(t, B_METADIRTY) && bt_meta(t) == RET_ERROR)
- return (RET_ERROR);
-
- if ((status = mpool_sync(t->bt_mp)) == RET_SUCCESS)
- F_CLR(t, B_MODIFIED);
-
- return (status);
-}
-
-/*
- * BT_META -- write the tree meta data to disk.
- *
- * Parameters:
- * t: tree
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS
- */
-static int
-bt_meta(t)
- BTREE *t;
-{
- BTMETA m;
- void *p;
-
- if ((p = mpool_get(t->bt_mp, P_META, 0)) == NULL)
- return (RET_ERROR);
-
- /* Fill in metadata. */
- m.magic = BTREEMAGIC;
- m.version = BTREEVERSION;
- m.psize = t->bt_psize;
- m.free = t->bt_free;
- m.nrecs = t->bt_nrecs;
- m.flags = F_ISSET(t, SAVEMETA);
-
- memmove(p, &m, sizeof(BTMETA));
- mpool_put(t->bt_mp, p, MPOOL_DIRTY);
- return (RET_SUCCESS);
-}
diff --git a/src/util/db2/btree/bt_conv.c b/src/util/db2/btree/bt_conv.c
deleted file mode 100644
index 6cfa216ca8..0000000000
--- a/src/util/db2/btree/bt_conv.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Mike Olson.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)bt_conv.c 8.5 (Berkeley) 8/17/94";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/param.h>
-
-#include <stdio.h>
-
-#include "db-int.h"
-#include "btree.h"
-
-static void mswap __P((PAGE *));
-
-/*
- * __BT_BPGIN, __BT_BPGOUT --
- * Convert host-specific number layout to/from the host-independent
- * format stored on disk.
- *
- * Parameters:
- * t: tree
- * pg: page number
- * h: page to convert
- */
-void
-__bt_pgin(t, pg, pp)
- void *t;
- db_pgno_t pg;
- void *pp;
-{
- PAGE *h;
- indx_t i, top;
- u_char flags;
- char *p;
-
- if (!F_ISSET(((BTREE *)t), B_NEEDSWAP))
- return;
- if (pg == P_META) {
- mswap(pp);
- return;
- }
-
- h = pp;
- M_32_SWAP(h->pgno);
- M_32_SWAP(h->prevpg);
- M_32_SWAP(h->nextpg);
- M_32_SWAP(h->flags);
- M_16_SWAP(h->lower);
- M_16_SWAP(h->upper);
-
- top = NEXTINDEX(h);
- if ((h->flags & P_TYPE) == P_BINTERNAL)
- for (i = 0; i < top; i++) {
- M_16_SWAP(h->linp[i]);
- p = (char *)GETBINTERNAL(h, i);
- P_32_SWAP(p);
- p += sizeof(u_int32_t);
- P_32_SWAP(p);
- p += sizeof(db_pgno_t);
- if (*(u_char *)p & P_BIGKEY) {
- p += sizeof(u_char);
- P_32_SWAP(p);
- p += sizeof(db_pgno_t);
- P_32_SWAP(p);
- }
- }
- else if ((h->flags & P_TYPE) == P_BLEAF)
- for (i = 0; i < top; i++) {
- M_16_SWAP(h->linp[i]);
- p = (char *)GETBLEAF(h, i);
- P_32_SWAP(p);
- p += sizeof(u_int32_t);
- P_32_SWAP(p);
- p += sizeof(u_int32_t);
- flags = *(u_char *)p;
- if (flags & (P_BIGKEY | P_BIGDATA)) {
- p += sizeof(u_char);
- if (flags & P_BIGKEY) {
- P_32_SWAP(p);
- p += sizeof(db_pgno_t);
- P_32_SWAP(p);
- }
- if (flags & P_BIGDATA) {
- p += sizeof(u_int32_t);
- P_32_SWAP(p);
- p += sizeof(db_pgno_t);
- P_32_SWAP(p);
- }
- }
- }
-}
-
-void
-__bt_pgout(t, pg, pp)
- void *t;
- db_pgno_t pg;
- void *pp;
-{
- PAGE *h;
- indx_t i, top;
- u_char flags;
- char *p;
-
- if (!F_ISSET(((BTREE *)t), B_NEEDSWAP))
- return;
- if (pg == P_META) {
- mswap(pp);
- return;
- }
-
- h = pp;
- top = NEXTINDEX(h);
- if ((h->flags & P_TYPE) == P_BINTERNAL)
- for (i = 0; i < top; i++) {
- p = (char *)GETBINTERNAL(h, i);
- P_32_SWAP(p);
- p += sizeof(u_int32_t);
- P_32_SWAP(p);
- p += sizeof(db_pgno_t);
- if (*(u_char *)p & P_BIGKEY) {
- p += sizeof(u_char);
- P_32_SWAP(p);
- p += sizeof(db_pgno_t);
- P_32_SWAP(p);
- }
- M_16_SWAP(h->linp[i]);
- }
- else if ((h->flags & P_TYPE) == P_BLEAF)
- for (i = 0; i < top; i++) {
- p = (char *)GETBLEAF(h, i);
- P_32_SWAP(p);
- p += sizeof(u_int32_t);
- P_32_SWAP(p);
- p += sizeof(u_int32_t);
- flags = *(u_char *)p;
- if (flags & (P_BIGKEY | P_BIGDATA)) {
- p += sizeof(u_char);
- if (flags & P_BIGKEY) {
- P_32_SWAP(p);
- p += sizeof(db_pgno_t);
- P_32_SWAP(p);
- }
- if (flags & P_BIGDATA) {
- p += sizeof(u_int32_t);
- P_32_SWAP(p);
- p += sizeof(db_pgno_t);
- P_32_SWAP(p);
- }
- }
- M_16_SWAP(h->linp[i]);
- }
-
- M_32_SWAP(h->pgno);
- M_32_SWAP(h->prevpg);
- M_32_SWAP(h->nextpg);
- M_32_SWAP(h->flags);
- M_16_SWAP(h->lower);
- M_16_SWAP(h->upper);
-}
-
-/*
- * MSWAP -- Actually swap the bytes on the meta page.
- *
- * Parameters:
- * p: page to convert
- */
-static void
-mswap(pg)
- PAGE *pg;
-{
- char *p;
-
- p = (char *)pg;
- P_32_SWAP(p); /* magic */
- p += sizeof(u_int32_t);
- P_32_SWAP(p); /* version */
- p += sizeof(u_int32_t);
- P_32_SWAP(p); /* psize */
- p += sizeof(u_int32_t);
- P_32_SWAP(p); /* free */
- p += sizeof(u_int32_t);
- P_32_SWAP(p); /* nrecs */
- p += sizeof(u_int32_t);
- P_32_SWAP(p); /* flags */
- p += sizeof(u_int32_t);
-}
diff --git a/src/util/db2/btree/bt_debug.c b/src/util/db2/btree/bt_debug.c
deleted file mode 100644
index d36256b3af..0000000000
--- a/src/util/db2/btree/bt_debug.c
+++ /dev/null
@@ -1,377 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994, 1995
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Mike Olson.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)bt_debug.c 8.6 (Berkeley) 1/9/95";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/param.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "db-int.h"
-#include "btree.h"
-
-#if defined(DEBUG) || defined(STATISTICS)
-
-static FILE *tracefp;
-
-/*
- * __bt_dinit --
- * initialize debugging.
- */
-static void
-__bt_dinit()
-{
- static int first = 1;
- char buf[1024];
-
- if (!first)
- return;
- first = 0;
-
-#ifndef TRACE_TO_STDERR
- if ((tracefp = fopen("/tmp/__bt_debug", "w")) != NULL)
- return;
-#endif
- tracefp = stderr;
-}
-#endif
-
-#ifdef DEBUG
-/*
- * __bt_dump --
- * dump the tree
- *
- * Parameters:
- * dbp: pointer to the DB
- */
-int
-__bt_dump(dbp)
- DB *dbp;
-{
- BTREE *t;
- PAGE *h;
- db_pgno_t i;
- char *sep;
-
- __bt_dinit();
-
- t = dbp->internal;
- (void)fprintf(tracefp, "%s: pgsz %d",
- F_ISSET(t, B_INMEM) ? "memory" : "disk", t->bt_psize);
- if (F_ISSET(t, R_RECNO))
- (void)fprintf(tracefp, " keys %lu", t->bt_nrecs);
-#undef X
-#define X(flag, name) \
- if (F_ISSET(t, flag)) { \
- (void)fprintf(tracefp, "%s%s", sep, name); \
- sep = ", "; \
- }
- if (t->flags != 0) {
- sep = " flags (";
- X(R_FIXLEN, "FIXLEN");
- X(B_INMEM, "INMEM");
- X(B_NODUPS, "NODUPS");
- X(B_RDONLY, "RDONLY");
- X(R_RECNO, "RECNO");
- X(B_METADIRTY,"METADIRTY");
- (void)fprintf(tracefp, ")\n");
- }
-#undef X
- for (i = P_ROOT; i < t->bt_mp->npages &&
- (h = mpool_get(t->bt_mp, i, MPOOL_IGNOREPIN)) != NULL; ++i)
- __bt_dpage(dbp, h);
- (void)fflush(tracefp);
- return (0);
-}
-
-/*
- * BT_DMPAGE -- Dump the meta page
- *
- * Parameters:
- * h: pointer to the PAGE
- */
-int
-__bt_dmpage(h)
- PAGE *h;
-{
- BTMETA *m;
- char *sep;
-
- __bt_dinit();
-
- m = (BTMETA *)h;
- (void)fprintf(tracefp, "magic %lx\n", m->magic);
- (void)fprintf(tracefp, "version %lu\n", m->version);
- (void)fprintf(tracefp, "psize %lu\n", m->psize);
- (void)fprintf(tracefp, "free %lu\n", m->free);
- (void)fprintf(tracefp, "nrecs %lu\n", m->nrecs);
- (void)fprintf(tracefp, "flags %lu", m->flags);
-#undef X
-#define X(flag, name) \
- if (m->flags & flag) { \
- (void)fprintf(tracefp, "%s%s", sep, name); \
- sep = ", "; \
- }
- if (m->flags) {
- sep = " (";
- X(B_NODUPS, "NODUPS");
- X(R_RECNO, "RECNO");
- (void)fprintf(tracefp, ")");
- }
- (void)fprintf(tracefp, "\n");
- (void)fflush(tracefp);
- return (0);
-}
-
-/*
- * BT_DNPAGE -- Dump the page
- *
- * Parameters:
- * n: page number to dump.
- */
-int
-__bt_dnpage(dbp, pgno)
- DB *dbp;
- db_pgno_t pgno;
-{
- BTREE *t;
- PAGE *h;
-
- __bt_dinit();
-
- t = dbp->internal;
- if ((h = mpool_get(t->bt_mp, pgno, MPOOL_IGNOREPIN)) != NULL)
- __bt_dpage(dbp, h);
- (void)fflush(tracefp);
- return (0);
-}
-
-/*
- * BT_DPAGE -- Dump the page
- *
- * Parameters:
- * h: pointer to the PAGE
- */
-int
-__bt_dpage(dbp, h)
- DB *dbp;
- PAGE *h;
-{
- BINTERNAL *bi;
- BLEAF *bl;
- RINTERNAL *ri;
- RLEAF *rl;
- u_long pgsize;
- indx_t cur, top, lim;
- char *sep;
-
- __bt_dinit();
-
- (void)fprintf(tracefp, " page %d: (", h->pgno);
-#undef X
-#define X(flag, name) \
- if (h->flags & flag) { \
- (void)fprintf(tracefp, "%s%s", sep, name); \
- sep = ", "; \
- }
- sep = "";
- X(P_BINTERNAL, "BINTERNAL") /* types */
- X(P_BLEAF, "BLEAF")
- X(P_RINTERNAL, "RINTERNAL") /* types */
- X(P_RLEAF, "RLEAF")
- X(P_OVERFLOW, "OVERFLOW")
- X(P_PRESERVE, "PRESERVE");
- (void)fprintf(tracefp, ")\n");
-#undef X
-
- (void)fprintf(tracefp, "\tprev %2d next %2d", h->prevpg, h->nextpg);
- if (h->flags & P_OVERFLOW)
- return;
-
- pgsize = ((BTREE *)dbp->internal)->bt_mp->pagesize;
- lim = (pgsize - BTDATAOFF) / sizeof(indx_t);
- top = NEXTINDEX(h);
- lim = top > lim ? lim : top;
- (void)fprintf(tracefp, " lower %3d upper %3d nextind %d\n",
- h->lower, h->upper, top);
- for (cur = 0; cur < lim; cur++) {
- (void)fprintf(tracefp, "\t[%03d] %4d ", cur, h->linp[cur]);
- switch (h->flags & P_TYPE) {
- case P_BINTERNAL:
- bi = GETBINTERNAL(h, cur);
- (void)fprintf(tracefp,
- "size %03d pgno %03d", bi->ksize, bi->pgno);
- if (bi->flags & P_BIGKEY)
- (void)fprintf(tracefp, " (indirect)");
- else if (bi->ksize)
- (void)fprintf(tracefp,
- " {%.*s}", (int)bi->ksize, bi->bytes);
- break;
- case P_RINTERNAL:
- ri = GETRINTERNAL(h, cur);
- (void)fprintf(tracefp, "entries %03d pgno %03d",
- ri->nrecs, ri->pgno);
- break;
- case P_BLEAF:
- bl = GETBLEAF(h, cur);
- if (bl->flags & P_BIGKEY)
- (void)fprintf(tracefp,
- "big key page %lu size %u/",
- *(db_pgno_t *)bl->bytes,
- *(u_int32_t *)(bl->bytes + sizeof(db_pgno_t)));
- else if (bl->ksize)
- (void)fprintf(tracefp, "%s/", bl->bytes);
- if (bl->flags & P_BIGDATA)
- (void)fprintf(tracefp,
- "big data page %lu size %u",
- *(db_pgno_t *)(bl->bytes + bl->ksize),
- *(u_int32_t *)(bl->bytes + bl->ksize +
- sizeof(db_pgno_t)));
- else if (bl->dsize)
- (void)fprintf(tracefp, "%.*s",
- (int)bl->dsize, bl->bytes + bl->ksize);
- break;
- case P_RLEAF:
- rl = GETRLEAF(h, cur);
- if (rl->flags & P_BIGDATA)
- (void)fprintf(tracefp,
- "big data page %lu size %u",
- *(db_pgno_t *)rl->bytes,
- *(u_int32_t *)(rl->bytes + sizeof(db_pgno_t)));
- else if (rl->dsize)
- (void)fprintf(tracefp,
- "%.*s", (int)rl->dsize, rl->bytes);
- break;
- }
- (void)fprintf(tracefp, "\n");
- }
- (void)fflush(tracefp);
- return (0);
-}
-#endif
-
-#ifdef STATISTICS
-/*
- * bt_stat --
- * Gather/print the tree statistics
- *
- * Parameters:
- * dbp: pointer to the DB
- */
-int
-__bt_stat(dbp)
- DB *dbp;
-{
- extern u_long bt_cache_hit, bt_cache_miss, bt_pfxsaved, bt_rootsplit;
- extern u_long bt_sortsplit, bt_split;
- BTREE *t;
- PAGE *h;
- db_pgno_t i, pcont, pinternal, pleaf;
- u_long ifree, lfree, nkeys;
- int levels;
-
- __bt_dinit();
-
- t = dbp->internal;
- pcont = pinternal = pleaf = 0;
- nkeys = ifree = lfree = 0;
- for (i = P_ROOT; i < t->bt_mp->npages &&
- (h = mpool_get(t->bt_mp, i, MPOOL_IGNOREPIN)) != NULL; ++i)
- switch (h->flags & P_TYPE) {
- case P_BINTERNAL:
- case P_RINTERNAL:
- ++pinternal;
- ifree += h->upper - h->lower;
- break;
- case P_BLEAF:
- case P_RLEAF:
- ++pleaf;
- lfree += h->upper - h->lower;
- nkeys += NEXTINDEX(h);
- break;
- case P_OVERFLOW:
- ++pcont;
- break;
- }
-
- /* Count the levels of the tree. */
- for (i = P_ROOT, levels = 0 ;; ++levels) {
- h = mpool_get(t->bt_mp, i, MPOOL_IGNOREPIN);
- if (h->flags & (P_BLEAF|P_RLEAF)) {
- if (levels == 0)
- levels = 1;
- break;
- }
- i = F_ISSET(t, R_RECNO) ?
- GETRINTERNAL(h, 0)->pgno :
- GETBINTERNAL(h, 0)->pgno;
- }
-
- (void)fprintf(tracefp, "%d level%s with %ld keys",
- levels, levels == 1 ? "" : "s", nkeys);
- if (F_ISSET(t, R_RECNO))
- (void)fprintf(tracefp, " (%ld header count)", t->bt_nrecs);
- (void)fprintf(tracefp,
- "\n%lu pages (leaf %ld, internal %ld, overflow %ld)\n",
- pinternal + pleaf + pcont, pleaf, pinternal, pcont);
- (void)fprintf(tracefp, "%ld cache hits, %ld cache misses\n",
- bt_cache_hit, bt_cache_miss);
- (void)fprintf(tracefp,
- "%ld splits (%ld root splits, %ld sort splits)\n",
- bt_split, bt_rootsplit, bt_sortsplit);
- pleaf *= t->bt_psize - BTDATAOFF;
- if (pleaf)
- (void)fprintf(tracefp,
- "%.0f%% leaf fill (%ld bytes used, %ld bytes free)\n",
- ((double)(pleaf - lfree) / pleaf) * 100,
- pleaf - lfree, lfree);
- pinternal *= t->bt_psize - BTDATAOFF;
- if (pinternal)
- (void)fprintf(tracefp,
- "%.0f%% internal fill (%ld bytes used, %ld bytes free\n",
- ((double)(pinternal - ifree) / pinternal) * 100,
- pinternal - ifree, ifree);
- if (bt_pfxsaved)
- (void)fprintf(tracefp, "prefix checking removed %lu bytes.\n",
- bt_pfxsaved);
- (void)fflush(tracefp);
- return (0);
-}
-#endif
diff --git a/src/util/db2/btree/bt_delete.c b/src/util/db2/btree/bt_delete.c
deleted file mode 100644
index d002a66edd..0000000000
--- a/src/util/db2/btree/bt_delete.c
+++ /dev/null
@@ -1,657 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Mike Olson.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)bt_delete.c 8.13 (Berkeley) 7/28/94";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "db-int.h"
-#include "btree.h"
-
-static int __bt_bdelete __P((BTREE *, const DBT *));
-static int __bt_curdel __P((BTREE *, const DBT *, PAGE *, u_int));
-static int __bt_pdelete __P((BTREE *, PAGE *));
-static int __bt_relink __P((BTREE *, PAGE *));
-static int __bt_stkacq __P((BTREE *, PAGE **, CURSOR *));
-
-/*
- * __bt_delete
- * Delete the item(s) referenced by a key.
- *
- * Return RET_SPECIAL if the key is not found.
- */
-int
-__bt_delete(dbp, key, flags)
- const DB *dbp;
- const DBT *key;
- u_int flags;
-{
- BTREE *t;
- CURSOR *c;
- PAGE *h;
- int status;
-
- t = dbp->internal;
-
- /* Toss any page pinned across calls. */
- if (t->bt_pinned != NULL) {
- mpool_put(t->bt_mp, t->bt_pinned, 0);
- t->bt_pinned = NULL;
- }
-
- /* Check for change to a read-only tree. */
- if (F_ISSET(t, B_RDONLY)) {
- errno = EPERM;
- return (RET_ERROR);
- }
-
- switch (flags) {
- case 0:
- status = __bt_bdelete(t, key);
- break;
- case R_CURSOR:
- /*
- * If flags is R_CURSOR, delete the cursor. Must already
- * have started a scan and not have already deleted it.
- */
- c = &t->bt_cursor;
- if (F_ISSET(c, CURS_INIT)) {
- if (F_ISSET(c, CURS_ACQUIRE | CURS_AFTER | CURS_BEFORE))
- return (RET_SPECIAL);
- if ((h = mpool_get(t->bt_mp, c->pg.pgno, 0)) == NULL)
- return (RET_ERROR);
-
- /*
- * If the page is about to be emptied, we'll need to
- * delete it, which means we have to acquire a stack.
- */
- if (NEXTINDEX(h) == 1)
- if (__bt_stkacq(t, &h, &t->bt_cursor))
- return (RET_ERROR);
-
- status = __bt_dleaf(t, NULL, h, c->pg.index);
-
- if (NEXTINDEX(h) == 0 && status == RET_SUCCESS) {
- if (__bt_pdelete(t, h))
- return (RET_ERROR);
- } else
- mpool_put(t->bt_mp,
- h, status == RET_SUCCESS ? MPOOL_DIRTY : 0);
- break;
- }
- /* FALLTHROUGH */
- default:
- errno = EINVAL;
- return (RET_ERROR);
- }
- if (status == RET_SUCCESS)
- F_SET(t, B_MODIFIED);
- return (status);
-}
-
-/*
- * __bt_stkacq --
- * Acquire a stack so we can delete a cursor entry.
- *
- * Parameters:
- * t: tree
- * hp: pointer to current, pinned PAGE pointer
- * c: pointer to the cursor
- *
- * Returns:
- * 0 on success, 1 on failure
- */
-static int
-__bt_stkacq(t, hp, c)
- BTREE *t;
- PAGE **hp;
- CURSOR *c;
-{
- BINTERNAL *bi;
- EPG *e;
- EPGNO *parent;
- PAGE *h;
- indx_t idx;
- db_pgno_t pgno;
- recno_t nextpg, prevpg;
- int exact, level;
-
- /*
- * Find the first occurrence of the key in the tree. Toss the
- * currently locked page so we don't hit an already-locked page.
- */
- h = *hp;
- mpool_put(t->bt_mp, h, 0);
- if ((e = __bt_search(t, &c->key, &exact)) == NULL)
- return (1);
- h = e->page;
-
- /* See if we got it in one shot. */
- if (h->pgno == c->pg.pgno)
- goto ret;
-
- /*
- * Move right, looking for the page. At each move we have to move
- * up the stack until we don't have to move to the next page. If
- * we have to change pages at an internal level, we have to fix the
- * stack back up.
- */
- while (h->pgno != c->pg.pgno) {
- if ((nextpg = h->nextpg) == P_INVALID)
- break;
- mpool_put(t->bt_mp, h, 0);
-
- /* Move up the stack. */
- for (level = 0; (parent = BT_POP(t)) != NULL; ++level) {
- /* Get the parent page. */
- if ((h = mpool_get(t->bt_mp, parent->pgno, 0)) == NULL)
- return (1);
-
- /* Move to the next index. */
- if (parent->index != NEXTINDEX(h) - 1) {
- idx = parent->index + 1;
- BT_PUSH(t, h->pgno, idx);
- break;
- }
- mpool_put(t->bt_mp, h, 0);
- }
-
- /* Restore the stack. */
- while (level--) {
- /* Push the next level down onto the stack. */
- bi = GETBINTERNAL(h, idx);
- pgno = bi->pgno;
- BT_PUSH(t, pgno, 0);
-
- /* Lose the currently pinned page. */
- mpool_put(t->bt_mp, h, 0);
-
- /* Get the next level down. */
- if ((h = mpool_get(t->bt_mp, pgno, 0)) == NULL)
- return (1);
- idx = 0;
- }
- mpool_put(t->bt_mp, h, 0);
- if ((h = mpool_get(t->bt_mp, nextpg, 0)) == NULL)
- return (1);
- }
-
- if (h->pgno == c->pg.pgno)
- goto ret;
-
- /* Reacquire the original stack. */
- mpool_put(t->bt_mp, h, 0);
- if ((e = __bt_search(t, &c->key, &exact)) == NULL)
- return (1);
- h = e->page;
-
- /*
- * Move left, looking for the page. At each move we have to move
- * up the stack until we don't have to change pages to move to the
- * next page. If we have to change pages at an internal level, we
- * have to fix the stack back up.
- */
- while (h->pgno != c->pg.pgno) {
- if ((prevpg = h->prevpg) == P_INVALID)
- break;
- mpool_put(t->bt_mp, h, 0);
-
- /* Move up the stack. */
- for (level = 0; (parent = BT_POP(t)) != NULL; ++level) {
- /* Get the parent page. */
- if ((h = mpool_get(t->bt_mp, parent->pgno, 0)) == NULL)
- return (1);
-
- /* Move to the next index. */
- if (parent->index != 0) {
- idx = parent->index - 1;
- BT_PUSH(t, h->pgno, idx);
- break;
- }
- mpool_put(t->bt_mp, h, 0);
- }
-
- /* Restore the stack. */
- while (level--) {
- /* Push the next level down onto the stack. */
- bi = GETBINTERNAL(h, idx);
- pgno = bi->pgno;
-
- /* Lose the currently pinned page. */
- mpool_put(t->bt_mp, h, 0);
-
- /* Get the next level down. */
- if ((h = mpool_get(t->bt_mp, pgno, 0)) == NULL)
- return (1);
-
- idx = NEXTINDEX(h) - 1;
- BT_PUSH(t, pgno, idx);
- }
- mpool_put(t->bt_mp, h, 0);
- if ((h = mpool_get(t->bt_mp, prevpg, 0)) == NULL)
- return (1);
- }
-
-
-ret: mpool_put(t->bt_mp, h, 0);
- return ((*hp = mpool_get(t->bt_mp, c->pg.pgno, 0)) == NULL);
-}
-
-/*
- * __bt_bdelete --
- * Delete all key/data pairs matching the specified key.
- *
- * Parameters:
- * t: tree
- * key: key to delete
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS and RET_SPECIAL if the key not found.
- */
-static int
-__bt_bdelete(t, key)
- BTREE *t;
- const DBT *key;
-{
- EPG *e;
- PAGE *h;
- int deleted, exact, redo;
-
- deleted = 0;
-
- /* Find any matching record; __bt_search pins the page. */
-loop: if ((e = __bt_search(t, key, &exact)) == NULL)
- return (deleted ? RET_SUCCESS : RET_ERROR);
- if (!exact) {
- mpool_put(t->bt_mp, e->page, 0);
- return (deleted ? RET_SUCCESS : RET_SPECIAL);
- }
-
- /*
- * Delete forward, then delete backward, from the found key. If
- * there are duplicates and we reach either side of the page, do
- * the key search again, so that we get them all.
- */
- redo = 0;
- h = e->page;
- do {
- if (__bt_dleaf(t, key, h, e->index)) {
- mpool_put(t->bt_mp, h, 0);
- return (RET_ERROR);
- }
- if (F_ISSET(t, B_NODUPS)) {
- if (NEXTINDEX(h) == 0) {
- if (__bt_pdelete(t, h))
- return (RET_ERROR);
- } else
- mpool_put(t->bt_mp, h, MPOOL_DIRTY);
- return (RET_SUCCESS);
- }
- deleted = 1;
- } while (e->index < NEXTINDEX(h) && __bt_cmp(t, key, e) == 0);
-
- /* Check for right-hand edge of the page. */
- if (e->index == NEXTINDEX(h))
- redo = 1;
-
- /* Delete from the key to the beginning of the page. */
- while (e->index-- > 0) {
- if (__bt_cmp(t, key, e) != 0)
- break;
- if (__bt_dleaf(t, key, h, e->index) == RET_ERROR) {
- mpool_put(t->bt_mp, h, 0);
- return (RET_ERROR);
- }
- if (e->index == 0)
- redo = 1;
- }
-
- /* Check for an empty page. */
- if (NEXTINDEX(h) == 0) {
- if (__bt_pdelete(t, h))
- return (RET_ERROR);
- goto loop;
- }
-
- /* Put the page. */
- mpool_put(t->bt_mp, h, MPOOL_DIRTY);
-
- if (redo)
- goto loop;
- return (RET_SUCCESS);
-}
-
-/*
- * __bt_pdelete --
- * Delete a single page from the tree.
- *
- * Parameters:
- * t: tree
- * h: leaf page
- *
- * Returns:
- * RET_SUCCESS, RET_ERROR.
- *
- * Side-effects:
- * mpool_put's the page
- */
-static int
-__bt_pdelete(t, h)
- BTREE *t;
- PAGE *h;
-{
- BINTERNAL *bi;
- PAGE *pg;
- EPGNO *parent;
- indx_t cnt, idx, *ip, offset;
- u_int32_t nksize;
- char *from;
-
- /*
- * Walk the parent page stack -- a LIFO stack of the pages that were
- * traversed when we searched for the page where the delete occurred.
- * Each stack entry is a page number and a page index offset. The
- * offset is for the page traversed on the search. We've just deleted
- * a page, so we have to delete the key from the parent page.
- *
- * If the delete from the parent page makes it empty, this process may
- * continue all the way up the tree. We stop if we reach the root page
- * (which is never deleted, it's just not worth the effort) or if the
- * delete does not empty the page.
- */
- while ((parent = BT_POP(t)) != NULL) {
- /* Get the parent page. */
- if ((pg = mpool_get(t->bt_mp, parent->pgno, 0)) == NULL)
- return (RET_ERROR);
-
- idx = parent->index;
- bi = GETBINTERNAL(pg, idx);
-
- /* Free any overflow pages. */
- if (bi->flags & P_BIGKEY &&
- __ovfl_delete(t, bi->bytes) == RET_ERROR) {
- mpool_put(t->bt_mp, pg, 0);
- return (RET_ERROR);
- }
-
- /*
- * Free the parent if it has only the one key and it's not the
- * root page. If it's the rootpage, turn it back into an empty
- * leaf page.
- */
- if (NEXTINDEX(pg) == 1)
- if (pg->pgno == P_ROOT) {
- pg->lower = BTDATAOFF;
- pg->upper = t->bt_psize;
- pg->flags = P_BLEAF;
- } else {
- if (__bt_relink(t, pg) || __bt_free(t, pg))
- return (RET_ERROR);
- continue;
- }
- else {
- /* Pack remaining key items at the end of the page. */
- nksize = NBINTERNAL(bi->ksize);
- from = (char *)pg + pg->upper;
- memmove(from + nksize, from, (char *)bi - from);
- pg->upper += nksize;
-
- /* Adjust indices' offsets, shift the indices down. */
- offset = pg->linp[idx];
- for (cnt = idx, ip = &pg->linp[0]; cnt--; ++ip)
- if (ip[0] < offset)
- ip[0] += nksize;
- for (cnt = NEXTINDEX(pg) - idx; --cnt; ++ip)
- ip[0] = ip[1] < offset ? ip[1] + nksize : ip[1];
- pg->lower -= sizeof(indx_t);
- }
-
- mpool_put(t->bt_mp, pg, MPOOL_DIRTY);
- break;
- }
-
- /* Free the leaf page, as long as it wasn't the root. */
- if (h->pgno == P_ROOT) {
- mpool_put(t->bt_mp, h, MPOOL_DIRTY);
- return (RET_SUCCESS);
- }
- return (__bt_relink(t, h) || __bt_free(t, h));
-}
-
-/*
- * __bt_dleaf --
- * Delete a single record from a leaf page.
- *
- * Parameters:
- * t: tree
- * key: referenced key
- * h: page
- * idx: index on page to delete
- *
- * Returns:
- * RET_SUCCESS, RET_ERROR.
- */
-int
-__bt_dleaf(t, key, h, idx)
- BTREE *t;
- const DBT *key;
- PAGE *h;
- u_int idx;
-{
- BLEAF *bl;
- indx_t cnt, *ip, offset;
- u_int32_t nbytes;
- void *to;
- char *from;
-
- /* If this record is referenced by the cursor, delete the cursor. */
- if (F_ISSET(&t->bt_cursor, CURS_INIT) &&
- !F_ISSET(&t->bt_cursor, CURS_ACQUIRE) &&
- t->bt_cursor.pg.pgno == h->pgno && t->bt_cursor.pg.index == idx &&
- __bt_curdel(t, key, h, idx))
- return (RET_ERROR);
-
- /* If the entry uses overflow pages, make them available for reuse. */
- to = bl = GETBLEAF(h, idx);
- if (bl->flags & P_BIGKEY && __ovfl_delete(t, bl->bytes) == RET_ERROR)
- return (RET_ERROR);
- if (bl->flags & P_BIGDATA &&
- __ovfl_delete(t, bl->bytes + bl->ksize) == RET_ERROR)
- return (RET_ERROR);
-
- /* Pack the remaining key/data items at the end of the page. */
- nbytes = NBLEAF(bl);
- from = (char *)h + h->upper;
- memmove(from + nbytes, from, (char *)to - from);
- h->upper += nbytes;
-
- /* Adjust the indices' offsets, shift the indices down. */
- offset = h->linp[idx];
- for (cnt = idx, ip = &h->linp[0]; cnt--; ++ip)
- if (ip[0] < offset)
- ip[0] += nbytes;
- for (cnt = NEXTINDEX(h) - idx; --cnt; ++ip)
- ip[0] = ip[1] < offset ? ip[1] + nbytes : ip[1];
- h->lower -= sizeof(indx_t);
-
- /* If the cursor is on this page, adjust it as necessary. */
- if (F_ISSET(&t->bt_cursor, CURS_INIT) &&
- !F_ISSET(&t->bt_cursor, CURS_ACQUIRE) &&
- t->bt_cursor.pg.pgno == h->pgno && t->bt_cursor.pg.index > idx)
- --t->bt_cursor.pg.index;
-
- return (RET_SUCCESS);
-}
-
-/*
- * __bt_curdel --
- * Delete the cursor.
- *
- * Parameters:
- * t: tree
- * key: referenced key (or NULL)
- * h: page
- * idx: idx on page to delete
- *
- * Returns:
- * RET_SUCCESS, RET_ERROR.
- */
-static int
-__bt_curdel(t, key, h, idx)
- BTREE *t;
- const DBT *key;
- PAGE *h;
- u_int idx;
-{
- CURSOR *c;
- EPG e;
- PAGE *pg;
- int curcopy, status;
-
- /*
- * If there are duplicates, move forward or backward to one.
- * Otherwise, copy the key into the cursor area.
- */
- c = &t->bt_cursor;
- F_CLR(c, CURS_AFTER | CURS_BEFORE | CURS_ACQUIRE);
-
- curcopy = 0;
- if (!F_ISSET(t, B_NODUPS)) {
- /*
- * We're going to have to do comparisons. If we weren't
- * provided a copy of the key, i.e. the user is deleting
- * the current cursor position, get one.
- */
- if (key == NULL) {
- e.page = h;
- e.index = idx;
- if ((status = __bt_ret(t, &e,
- &c->key, &c->key, NULL, NULL, 1)) != RET_SUCCESS)
- return (status);
- curcopy = 1;
- key = &c->key;
- }
- /* Check previous key, if not at the beginning of the page. */
- if (idx > 0) {
- e.page = h;
- e.index = idx - 1;
- if (__bt_cmp(t, key, &e) == 0) {
- F_SET(c, CURS_BEFORE);
- goto dup2;
- }
- }
- /* Check next key, if not at the end of the page. */
- if (idx < NEXTINDEX(h) - 1) {
- e.page = h;
- e.index = idx + 1;
- if (__bt_cmp(t, key, &e) == 0) {
- F_SET(c, CURS_AFTER);
- goto dup2;
- }
- }
- /* Check previous key if at the beginning of the page. */
- if (idx == 0 && h->prevpg != P_INVALID) {
- if ((pg = mpool_get(t->bt_mp, h->prevpg, 0)) == NULL)
- return (RET_ERROR);
- e.page = pg;
- e.index = NEXTINDEX(pg) - 1;
- if (__bt_cmp(t, key, &e) == 0) {
- F_SET(c, CURS_BEFORE);
- goto dup1;
- }
- mpool_put(t->bt_mp, pg, 0);
- }
- /* Check next key if at the end of the page. */
- if (idx == NEXTINDEX(h) - 1 && h->nextpg != P_INVALID) {
- if ((pg = mpool_get(t->bt_mp, h->nextpg, 0)) == NULL)
- return (RET_ERROR);
- e.page = pg;
- e.index = 0;
- if (__bt_cmp(t, key, &e) == 0) {
- F_SET(c, CURS_AFTER);
-dup1: mpool_put(t->bt_mp, pg, 0);
-dup2: c->pg.pgno = e.page->pgno;
- c->pg.index = e.index;
- return (RET_SUCCESS);
- }
- mpool_put(t->bt_mp, pg, 0);
- }
- }
- e.page = h;
- e.index = idx;
- if (curcopy || (status =
- __bt_ret(t, &e, &c->key, &c->key, NULL, NULL, 1)) == RET_SUCCESS) {
- F_SET(c, CURS_ACQUIRE);
- return (RET_SUCCESS);
- }
- return (status);
-}
-
-/*
- * __bt_relink --
- * Link around a deleted page.
- *
- * Parameters:
- * t: tree
- * h: page to be deleted
- */
-static int
-__bt_relink(t, h)
- BTREE *t;
- PAGE *h;
-{
- PAGE *pg;
-
- if (h->nextpg != P_INVALID) {
- if ((pg = mpool_get(t->bt_mp, h->nextpg, 0)) == NULL)
- return (RET_ERROR);
- pg->prevpg = h->prevpg;
- mpool_put(t->bt_mp, pg, MPOOL_DIRTY);
- }
- if (h->prevpg != P_INVALID) {
- if ((pg = mpool_get(t->bt_mp, h->prevpg, 0)) == NULL)
- return (RET_ERROR);
- pg->nextpg = h->nextpg;
- mpool_put(t->bt_mp, pg, MPOOL_DIRTY);
- }
- return (0);
-}
diff --git a/src/util/db2/btree/bt_get.c b/src/util/db2/btree/bt_get.c
deleted file mode 100644
index b6318211a1..0000000000
--- a/src/util/db2/btree/bt_get.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Mike Olson.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)bt_get.c 8.6 (Berkeley) 7/20/94";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-
-#include <errno.h>
-#include <stddef.h>
-#include <stdio.h>
-
-#include "db-int.h"
-#include "btree.h"
-
-/*
- * __BT_GET -- Get a record from the btree.
- *
- * Parameters:
- * dbp: pointer to access method
- * key: key to find
- * data: data to return
- * flag: currently unused
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS and RET_SPECIAL if the key not found.
- */
-int
-__bt_get(dbp, key, data, flags)
- const DB *dbp;
- const DBT *key;
- DBT *data;
- u_int flags;
-{
- BTREE *t;
- EPG *e;
- int exact, status;
-
- t = dbp->internal;
-
- /* Toss any page pinned across calls. */
- if (t->bt_pinned != NULL) {
- mpool_put(t->bt_mp, t->bt_pinned, 0);
- t->bt_pinned = NULL;
- }
-
- /* Get currently doesn't take any flags. */
- if (flags) {
- errno = EINVAL;
- return (RET_ERROR);
- }
-
- if ((e = __bt_search(t, key, &exact)) == NULL)
- return (RET_ERROR);
- if (!exact) {
- mpool_put(t->bt_mp, e->page, 0);
- return (RET_SPECIAL);
- }
-
- status = __bt_ret(t, e, NULL, NULL, data, &t->bt_rdata, 0);
-
- /*
- * If the user is doing concurrent access, we copied the
- * key/data, toss the page.
- */
- if (F_ISSET(t, B_DB_LOCK))
- mpool_put(t->bt_mp, e->page, 0);
- else
- t->bt_pinned = e->page;
- return (status);
-}
diff --git a/src/util/db2/btree/bt_open.c b/src/util/db2/btree/bt_open.c
deleted file mode 100644
index 3e4c67a4bc..0000000000
--- a/src/util/db2/btree/bt_open.c
+++ /dev/null
@@ -1,476 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Mike Olson.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)bt_open.c 8.11 (Berkeley) 11/2/95";
-#endif /* LIBC_SCCS and not lint */
-
-/*
- * Implementation of btree access method for 4.4BSD.
- *
- * The design here was originally based on that of the btree access method
- * used in the Postgres database system at UC Berkeley. This implementation
- * is wholly independent of the Postgres code.
- */
-
-#include <sys/param.h>
-#include <sys/stat.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "db-int.h"
-#include "btree.h"
-
-#ifdef DEBUG
-#undef MINPSIZE
-#define MINPSIZE 128
-#endif
-
-static int byteorder __P((void));
-static int nroot __P((BTREE *));
-static int tmp __P((void));
-
-/*
- * __BT_OPEN -- Open a btree.
- *
- * Creates and fills a DB struct, and calls the routine that actually
- * opens the btree.
- *
- * Parameters:
- * fname: filename (NULL for in-memory trees)
- * flags: open flag bits
- * mode: open permission bits
- * b: BTREEINFO pointer
- *
- * Returns:
- * NULL on failure, pointer to DB on success.
- *
- */
-DB *
-__bt_open(fname, flags, mode, openinfo, dflags)
- const char *fname;
- int flags, mode, dflags;
- const BTREEINFO *openinfo;
-{
- struct stat sb;
- BTMETA m;
- BTREE *t;
- BTREEINFO b;
- DB *dbp;
- db_pgno_t ncache;
- ssize_t nr;
- int machine_lorder;
-
- t = NULL;
-
- /*
- * Intention is to make sure all of the user's selections are okay
- * here and then use them without checking. Can't be complete, since
- * we don't know the right page size, lorder or flags until the backing
- * file is opened. Also, the file's page size can cause the cachesize
- * to change.
- */
- machine_lorder = byteorder();
- if (openinfo) {
- b = *openinfo;
-
- /* Flags: R_DUP. */
- if (b.flags & ~(R_DUP))
- goto einval;
-
- /*
- * Page size must be indx_t aligned and >= MINPSIZE. Default
- * page size is set farther on, based on the underlying file
- * transfer size.
- */
- if (b.psize &&
- (b.psize < MINPSIZE || b.psize > MAX_PAGE_OFFSET + 1 ||
- b.psize & (sizeof(indx_t) - 1)))
- goto einval;
-
- /* Minimum number of keys per page; absolute minimum is 2. */
- if (b.minkeypage) {
- if (b.minkeypage < 2)
- goto einval;
- } else
- b.minkeypage = DEFMINKEYPAGE;
-
- /* If no comparison, use default comparison and prefix. */
- if (b.compare == NULL) {
- b.compare = __bt_defcmp;
- if (b.prefix == NULL)
- b.prefix = __bt_defpfx;
- }
-
- if (b.lorder == 0)
- b.lorder = machine_lorder;
- } else {
- b.compare = __bt_defcmp;
- b.cachesize = 0;
- b.flags = 0;
- b.lorder = machine_lorder;
- b.minkeypage = DEFMINKEYPAGE;
- b.prefix = __bt_defpfx;
- b.psize = 0;
- }
-
- /* Check for the ubiquitous PDP-11. */
- if (b.lorder != DB_BIG_ENDIAN && b.lorder != DB_LITTLE_ENDIAN)
- goto einval;
-
- /* Allocate and initialize DB and BTREE structures. */
- if ((t = (BTREE *)malloc(sizeof(BTREE))) == NULL)
- goto err;
- memset(t, 0, sizeof(BTREE));
- t->bt_fd = -1; /* Don't close unopened fd on error. */
- t->bt_lorder = b.lorder;
- t->bt_order = NOT;
- t->bt_cmp = b.compare;
- t->bt_pfx = b.prefix;
- t->bt_rfd = -1;
-
- if ((t->bt_dbp = dbp = (DB *)malloc(sizeof(DB))) == NULL)
- goto err;
- memset(t->bt_dbp, 0, sizeof(DB));
- if (t->bt_lorder != machine_lorder)
- F_SET(t, B_NEEDSWAP);
-
- dbp->type = DB_BTREE;
- dbp->internal = t;
- dbp->close = __bt_close;
- dbp->del = __bt_delete;
- dbp->fd = __bt_fd;
- dbp->get = __bt_get;
- dbp->put = __bt_put;
- dbp->seq = __bt_seq;
- dbp->sync = __bt_sync;
-
- /*
- * If no file name was supplied, this is an in-memory btree and we
- * open a backing temporary file. Otherwise, it's a disk-based tree.
- */
- if (fname) {
- switch (flags & O_ACCMODE) {
- case O_RDONLY:
- F_SET(t, B_RDONLY);
- break;
- case O_RDWR:
- break;
- case O_WRONLY:
- default:
- goto einval;
- }
-
- if ((t->bt_fd = open(fname, flags | O_BINARY, mode)) < 0)
- goto err;
-
- } else {
- if ((flags & O_ACCMODE) != O_RDWR)
- goto einval;
- if ((t->bt_fd = tmp()) == -1)
- goto err;
- F_SET(t, B_INMEM);
- }
-
- if (fcntl(t->bt_fd, F_SETFD, 1) == -1)
- goto err;
-
- if (fstat(t->bt_fd, &sb))
- goto err;
- if (sb.st_size) {
- if ((nr = read(t->bt_fd, &m, sizeof(BTMETA))) < 0)
- goto err;
- if (nr != sizeof(BTMETA))
- goto eftype;
-
- /*
- * Read in the meta-data. This can change the notion of what
- * the lorder, page size and flags are, and, when the page size
- * changes, the cachesize value can change too. If the user
- * specified the wrong byte order for an existing database, we
- * don't bother to return an error, we just clear the NEEDSWAP
- * bit.
- */
- if (m.magic == BTREEMAGIC)
- F_CLR(t, B_NEEDSWAP);
- else {
- F_SET(t, B_NEEDSWAP);
- M_32_SWAP(m.magic);
- M_32_SWAP(m.version);
- M_32_SWAP(m.psize);
- M_32_SWAP(m.free);
- M_32_SWAP(m.nrecs);
- M_32_SWAP(m.flags);
- }
- if (m.magic != BTREEMAGIC || m.version != BTREEVERSION)
- goto eftype;
- if (m.psize < MINPSIZE || m.psize > MAX_PAGE_OFFSET + 1 ||
- m.psize & (sizeof(indx_t) - 1))
- goto eftype;
- if (m.flags & ~SAVEMETA)
- goto eftype;
- b.psize = m.psize;
- F_SET(t, m.flags);
- t->bt_free = m.free;
- t->bt_nrecs = m.nrecs;
- } else {
- /*
- * Set the page size to the best value for I/O to this file.
- * Don't overflow the page offset type.
- */
- if (b.psize == 0) {
- b.psize = sb.st_blksize;
- if (b.psize < MINPSIZE)
- b.psize = MINPSIZE;
- if (b.psize > MAX_PAGE_OFFSET + 1)
- b.psize = MAX_PAGE_OFFSET + 1;
- }
-
- /* Set flag if duplicates permitted. */
- if (!(b.flags & R_DUP))
- F_SET(t, B_NODUPS);
-
- t->bt_free = P_INVALID;
- t->bt_nrecs = 0;
- F_SET(t, B_METADIRTY);
- }
-
- t->bt_psize = b.psize;
-
- /* Set the cache size; must be a multiple of the page size. */
- if (b.cachesize && b.cachesize & (b.psize - 1))
- b.cachesize += (~b.cachesize & (b.psize - 1)) + 1;
- if (b.cachesize < b.psize * MINCACHE)
- b.cachesize = b.psize * MINCACHE;
-
- /* Calculate number of pages to cache. */
- ncache = (b.cachesize + t->bt_psize - 1) / t->bt_psize;
-
- /*
- * The btree data structure requires that at least two keys can fit on
- * a page, but other than that there's no fixed requirement. The user
- * specified a minimum number per page, and we translated that into the
- * number of bytes a key/data pair can use before being placed on an
- * overflow page. This calculation includes the page header, the size
- * of the index referencing the leaf item and the size of the leaf item
- * structure. Also, don't let the user specify a minkeypage such that
- * a key/data pair won't fit even if both key and data are on overflow
- * pages.
- */
- t->bt_ovflsize = (t->bt_psize - BTDATAOFF) / b.minkeypage -
- (sizeof(indx_t) + NBLEAFDBT(0, 0));
- if (t->bt_ovflsize < NBLEAFDBT(NOVFLSIZE, NOVFLSIZE) + sizeof(indx_t))
- t->bt_ovflsize =
- NBLEAFDBT(NOVFLSIZE, NOVFLSIZE) + sizeof(indx_t);
-
- /* Initialize the buffer pool. */
- if ((t->bt_mp =
- mpool_open(NULL, t->bt_fd, t->bt_psize, ncache)) == NULL)
- goto err;
- if (!F_ISSET(t, B_INMEM))
- mpool_filter(t->bt_mp, __bt_pgin, __bt_pgout, t);
-
- /* Create a root page if new tree. */
- if (nroot(t) == RET_ERROR)
- goto err;
-
- /* Global flags. */
- if (dflags & DB_LOCK)
- F_SET(t, B_DB_LOCK);
- if (dflags & DB_SHMEM)
- F_SET(t, B_DB_SHMEM);
- if (dflags & DB_TXN)
- F_SET(t, B_DB_TXN);
-
- return (dbp);
-
-einval: errno = EINVAL;
- goto err;
-
-eftype: errno = EFTYPE;
- goto err;
-
-err: if (t) {
- if (t->bt_dbp)
- free(t->bt_dbp);
- if (t->bt_fd != -1)
- (void)close(t->bt_fd);
- free(t);
- }
- return (NULL);
-}
-
-/*
- * NROOT -- Create the root of a new tree.
- *
- * Parameters:
- * t: tree
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS
- */
-static int
-nroot(t)
- BTREE *t;
-{
- PAGE *meta, *root;
- db_pgno_t npg;
-
- if ((root = mpool_get(t->bt_mp, 1, 0)) != NULL) {
- if (root->lower == 0 &&
- root->pgno == 0 &&
- root->linp[0] == 0) {
- mpool_delete(t->bt_mp, root);
- errno = EINVAL;
- } else {
- mpool_put(t->bt_mp, root, 0);
- return (RET_SUCCESS);
- }
- }
- if (errno != EINVAL) /* It's OK to not exist. */
- return (RET_ERROR);
- errno = 0;
-
- if ((meta = mpool_new(t->bt_mp, &npg, MPOOL_PAGE_NEXT)) == NULL)
- return (RET_ERROR);
-
- if ((root = mpool_new(t->bt_mp, &npg, MPOOL_PAGE_NEXT)) == NULL)
- return (RET_ERROR);
-
- if (npg != P_ROOT)
- return (RET_ERROR);
- root->pgno = npg;
- root->prevpg = root->nextpg = P_INVALID;
- root->lower = BTDATAOFF;
- root->upper = t->bt_psize;
- root->flags = P_BLEAF;
- memset(meta, 0, t->bt_psize);
- mpool_put(t->bt_mp, meta, MPOOL_DIRTY);
- mpool_put(t->bt_mp, root, MPOOL_DIRTY);
- return (RET_SUCCESS);
-}
-
-static int
-tmp()
-{
-#ifdef SIG_BLOCK
- sigset_t set, oset;
-#else
- int oset;
-#endif
- int fd;
- char *envtmp;
- char path[MAXPATHLEN];
- static char fn[] = "/bt.XXXXXX";
-
- envtmp = getenv("TMPDIR");
-
- /* this used to be done with snprintf(), but since snprintf
- isn't in most operating systems, and overflow checking in
- this case is easy, this is what is done */
-
- if (envtmp && ((strlen(envtmp)+sizeof(fn)+1) > sizeof(path)))
- return(-1);
-
- (void)sprintf(path, "%s%s", (envtmp ? envtmp : "/tmp"), fn);
-
-#ifdef SIG_BLOCK
- (void)sigfillset(&set);
- (void)sigprocmask(SIG_BLOCK, &set, &oset);
-#else
- oset = sigblock(~0);
-#endif
- if ((fd = mkstemp(path)) != -1)
- (void)unlink(path);
-#ifdef SIG_BLOCK
- (void)sigprocmask(SIG_SETMASK, &oset, NULL);
-#else
- sigsetmask(oset);
-#endif
-#ifdef __CYGWIN32__
- /* Ensure the fd is in binary mode. */
- setmode(fd, O_BINARY);
-#endif /* __CYGWIN32__ */
-
- return(fd);
-}
-
-static int
-byteorder()
-{
- u_int32_t x;
- u_char *p;
-
- x = 0x01020304;
- p = (u_char *)&x;
- switch (*p) {
- case 1:
- return (DB_BIG_ENDIAN);
- case 4:
- return (DB_LITTLE_ENDIAN);
- default:
- return (0);
- }
-}
-
-int
-__bt_fd(dbp)
- const DB *dbp;
-{
- BTREE *t;
-
- t = dbp->internal;
-
- /* Toss any page pinned across calls. */
- if (t->bt_pinned != NULL) {
- mpool_put(t->bt_mp, t->bt_pinned, 0);
- t->bt_pinned = NULL;
- }
-
- /* In-memory database can't have a file descriptor. */
- if (F_ISSET(t, B_INMEM)) {
- errno = ENOENT;
- return (-1);
- }
- return (t->bt_fd);
-}
diff --git a/src/util/db2/btree/bt_overflow.c b/src/util/db2/btree/bt_overflow.c
deleted file mode 100644
index 8b1f597912..0000000000
--- a/src/util/db2/btree/bt_overflow.c
+++ /dev/null
@@ -1,228 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Mike Olson.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)bt_overflow.c 8.5 (Berkeley) 7/16/94";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/param.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "db-int.h"
-#include "btree.h"
-
-/*
- * Big key/data code.
- *
- * Big key and data entries are stored on linked lists of pages. The initial
- * reference is byte string stored with the key or data and is the page number
- * and size. The actual record is stored in a chain of pages linked by the
- * nextpg field of the PAGE header.
- *
- * The first page of the chain has a special property. If the record is used
- * by an internal page, it cannot be deleted and the P_PRESERVE bit will be set
- * in the header.
- *
- * XXX
- * A single DBT is written to each chain, so a lot of space on the last page
- * is wasted. This is a fairly major bug for some data sets.
- */
-
-/*
- * __OVFL_GET -- Get an overflow key/data item.
- *
- * Parameters:
- * t: tree
- * p: pointer to { db_pgno_t, u_int32_t }
- * buf: storage address
- * bufsz: storage size
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS
- */
-int
-__ovfl_get(t, p, ssz, buf, bufsz)
- BTREE *t;
- void *p;
- size_t *ssz;
- void **buf;
- size_t *bufsz;
-{
- PAGE *h;
- db_pgno_t pg;
- size_t nb, plen;
- u_int32_t sz;
-
- memmove(&pg, p, sizeof(db_pgno_t));
- memmove(&sz, (char *)p + sizeof(db_pgno_t), sizeof(u_int32_t));
- *ssz = sz;
-
-#ifdef DEBUG
- if (pg == P_INVALID || sz == 0)
- abort();
-#endif
- /* Make the buffer bigger as necessary. */
- if (*bufsz < sz) {
- *buf = (char *)(*buf == NULL ? malloc(sz) : realloc(*buf, sz));
- if (*buf == NULL)
- return (RET_ERROR);
- *bufsz = sz;
- }
-
- /*
- * Step through the linked list of pages, copying the data on each one
- * into the buffer. Never copy more than the data's length.
- */
- plen = t->bt_psize - BTDATAOFF;
- for (p = *buf;; p = (char *)p + nb, pg = h->nextpg) {
- if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
- return (RET_ERROR);
-
- nb = MIN(sz, plen);
- memmove(p, (char *)h + BTDATAOFF, nb);
- mpool_put(t->bt_mp, h, 0);
-
- if ((sz -= nb) == 0)
- break;
- }
- return (RET_SUCCESS);
-}
-
-/*
- * __OVFL_PUT -- Store an overflow key/data item.
- *
- * Parameters:
- * t: tree
- * data: DBT to store
- * pgno: storage page number
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS
- */
-int
-__ovfl_put(t, dbt, pg)
- BTREE *t;
- const DBT *dbt;
- db_pgno_t *pg;
-{
- PAGE *h, *last;
- void *p;
- db_pgno_t npg;
- size_t nb, plen;
- u_int32_t sz;
-
- /*
- * Allocate pages and copy the key/data record into them. Store the
- * number of the first page in the chain.
- */
- plen = t->bt_psize - BTDATAOFF;
- for (last = NULL, p = dbt->data, sz = dbt->size;;
- p = (char *)p + plen, last = h) {
- if ((h = __bt_new(t, &npg)) == NULL)
- return (RET_ERROR);
-
- h->pgno = npg;
- h->nextpg = h->prevpg = P_INVALID;
- h->flags = P_OVERFLOW;
- h->lower = h->upper = 0;
-
- nb = MIN(sz, plen);
- memmove((char *)h + BTDATAOFF, p, nb);
-
- if (last) {
- last->nextpg = h->pgno;
- mpool_put(t->bt_mp, last, MPOOL_DIRTY);
- } else
- *pg = h->pgno;
-
- if ((sz -= nb) == 0) {
- mpool_put(t->bt_mp, h, MPOOL_DIRTY);
- break;
- }
- }
- return (RET_SUCCESS);
-}
-
-/*
- * __OVFL_DELETE -- Delete an overflow chain.
- *
- * Parameters:
- * t: tree
- * p: pointer to { db_pgno_t, u_int32_t }
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS
- */
-int
-__ovfl_delete(t, p)
- BTREE *t;
- void *p;
-{
- PAGE *h;
- db_pgno_t pg;
- size_t plen;
- u_int32_t sz;
-
- memmove(&pg, p, sizeof(db_pgno_t));
- memmove(&sz, (char *)p + sizeof(db_pgno_t), sizeof(u_int32_t));
-
-#ifdef DEBUG
- if (pg == P_INVALID || sz == 0)
- abort();
-#endif
- if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
- return (RET_ERROR);
-
- /* Don't delete chains used by internal pages. */
- if (h->flags & P_PRESERVE) {
- mpool_put(t->bt_mp, h, 0);
- return (RET_SUCCESS);
- }
-
- /* Step through the chain, calling the free routine for each page. */
- for (plen = t->bt_psize - BTDATAOFF;; sz -= plen) {
- pg = h->nextpg;
- __bt_free(t, h);
- if (sz <= plen)
- break;
- if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
- return (RET_ERROR);
- }
- return (RET_SUCCESS);
-}
diff --git a/src/util/db2/btree/bt_page.c b/src/util/db2/btree/bt_page.c
deleted file mode 100644
index 3663cf7f93..0000000000
--- a/src/util/db2/btree/bt_page.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)bt_page.c 8.4 (Berkeley) 11/2/95";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-
-#include <stdio.h>
-
-#include "db-int.h"
-#include "btree.h"
-
-/*
- * __bt_free --
- * Put a page on the freelist.
- *
- * Parameters:
- * t: tree
- * h: page to free
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS
- *
- * Side-effect:
- * mpool_put's the page.
- */
-int
-__bt_free(t, h)
- BTREE *t;
- PAGE *h;
-{
- /* Insert the page at the head of the free list. */
- h->prevpg = P_INVALID;
- h->nextpg = t->bt_free;
- t->bt_free = h->pgno;
- F_SET(t, B_METADIRTY);
-
- /* Make sure the page gets written back. */
- return (mpool_put(t->bt_mp, h, MPOOL_DIRTY));
-}
-
-/*
- * __bt_new --
- * Get a new page, preferably from the freelist.
- *
- * Parameters:
- * t: tree
- * npg: storage for page number.
- *
- * Returns:
- * Pointer to a page, NULL on error.
- */
-PAGE *
-__bt_new(t, npg)
- BTREE *t;
- db_pgno_t *npg;
-{
- PAGE *h;
-
- if (t->bt_free != P_INVALID &&
- (h = mpool_get(t->bt_mp, t->bt_free, 0)) != NULL) {
- *npg = t->bt_free;
- t->bt_free = h->nextpg;
- F_SET(t, B_METADIRTY);
- return (h);
- }
- return (mpool_new(t->bt_mp, npg, MPOOL_PAGE_NEXT));
-}
diff --git a/src/util/db2/btree/bt_put.c b/src/util/db2/btree/bt_put.c
deleted file mode 100644
index f75ca9295c..0000000000
--- a/src/util/db2/btree/bt_put.c
+++ /dev/null
@@ -1,328 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Mike Olson.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)bt_put.c 8.8 (Berkeley) 7/26/94";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "db-int.h"
-#include "btree.h"
-
-static EPG *bt_fast __P((BTREE *, const DBT *, const DBT *, int *));
-
-/*
- * __BT_PUT -- Add a btree item to the tree.
- *
- * Parameters:
- * dbp: pointer to access method
- * key: key
- * data: data
- * flag: R_NOOVERWRITE
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS and RET_SPECIAL if the key is already in the
- * tree and R_NOOVERWRITE specified.
- */
-int
-__bt_put(dbp, key, data, flags)
- const DB *dbp;
- DBT *key;
- const DBT *data;
- u_int flags;
-{
- BTREE *t;
- DBT tkey, tdata;
- EPG *e = 0;
- PAGE *h;
- indx_t idx, nxtindex;
- db_pgno_t pg;
- u_int32_t nbytes;
- int dflags, exact, status;
- char *dest, db[NOVFLSIZE], kb[NOVFLSIZE];
-
- t = dbp->internal;
-
- /* Toss any page pinned across calls. */
- if (t->bt_pinned != NULL) {
- mpool_put(t->bt_mp, t->bt_pinned, 0);
- t->bt_pinned = NULL;
- }
-
- /* Check for change to a read-only tree. */
- if (F_ISSET(t, B_RDONLY)) {
- errno = EPERM;
- return (RET_ERROR);
- }
-
- switch (flags) {
- case 0:
- case R_NOOVERWRITE:
- break;
- case R_CURSOR:
- /*
- * If flags is R_CURSOR, put the cursor. Must already
- * have started a scan and not have already deleted it.
- */
- if (F_ISSET(&t->bt_cursor, CURS_INIT) &&
- !F_ISSET(&t->bt_cursor,
- CURS_ACQUIRE | CURS_AFTER | CURS_BEFORE))
- break;
- /* FALLTHROUGH */
- default:
- errno = EINVAL;
- return (RET_ERROR);
- }
-
- /*
- * If the key/data pair won't fit on a page, store it on overflow
- * pages. Only put the key on the overflow page if the pair are
- * still too big after moving the data to an overflow page.
- *
- * XXX
- * If the insert fails later on, the overflow pages aren't recovered.
- */
- dflags = 0;
- if (key->size + data->size > t->bt_ovflsize) {
- if (key->size > t->bt_ovflsize) {
- u_int32_t yuck_this_is_gross_code;
-storekey: if (__ovfl_put(t, key, &pg) == RET_ERROR)
- return (RET_ERROR);
- tkey.data = kb;
- tkey.size = NOVFLSIZE;
- memmove(kb, &pg, sizeof(db_pgno_t));
- yuck_this_is_gross_code = key->size;
- if (yuck_this_is_gross_code != key->size)
- abort ();
- memmove(kb + sizeof(db_pgno_t),
- &yuck_this_is_gross_code, sizeof(u_int32_t));
- dflags |= P_BIGKEY;
- key = &tkey;
- }
- if (key->size + data->size > t->bt_ovflsize) {
- u_int32_t yuck_this_is_gross_code = data->size;
- if (__ovfl_put(t, data, &pg) == RET_ERROR)
- return (RET_ERROR);
- tdata.data = db;
- tdata.size = NOVFLSIZE;
- memmove(db, &pg, sizeof(db_pgno_t));
- if (yuck_this_is_gross_code != data->size)
- abort ();
- memmove(db + sizeof(db_pgno_t),
- &yuck_this_is_gross_code, sizeof(u_int32_t));
- dflags |= P_BIGDATA;
- data = &tdata;
- }
- if (key->size + data->size > t->bt_ovflsize)
- goto storekey;
- }
-
- /* Replace the cursor. */
- if (flags == R_CURSOR) {
- if ((h = mpool_get(t->bt_mp, t->bt_cursor.pg.pgno, 0)) == NULL)
- return (RET_ERROR);
- idx = t->bt_cursor.pg.index;
- goto delete;
- }
-
- /*
- * Find the key to delete, or, the location at which to insert.
- * Bt_fast and __bt_search both pin the returned page.
- */
- if (t->bt_order == NOT || (e = bt_fast(t, key, data, &exact)) == NULL)
- if ((e = __bt_search(t, key, &exact)) == NULL)
- return (RET_ERROR);
- h = e->page;
- idx = e->index;
-
- /*
- * Add the key/data pair to the tree. If an identical key is already
- * in the tree, and R_NOOVERWRITE is set, an error is returned. If
- * R_NOOVERWRITE is not set, the key is either added (if duplicates are
- * permitted) or an error is returned.
- */
- switch (flags) {
- case R_NOOVERWRITE:
- if (!exact)
- break;
- mpool_put(t->bt_mp, h, 0);
- return (RET_SPECIAL);
- default:
- if (!exact || !F_ISSET(t, B_NODUPS))
- break;
- /*
- * !!!
- * Note, the delete may empty the page, so we need to put a
- * new entry into the page immediately.
- */
-delete: if (__bt_dleaf(t, key, h, idx) == RET_ERROR) {
- mpool_put(t->bt_mp, h, 0);
- return (RET_ERROR);
- }
- break;
- }
-
- /*
- * If not enough room, or the user has put a ceiling on the number of
- * keys permitted in the page, split the page. The split code will
- * insert the key and data and unpin the current page. If inserting
- * into the offset array, shift the pointers up.
- */
- nbytes = NBLEAFDBT(key->size, data->size);
- if (h->upper - h->lower < nbytes + sizeof(indx_t)) {
- if ((status = __bt_split(t, h, key,
- data, dflags, nbytes, idx)) != RET_SUCCESS)
- return (status);
- goto success;
- }
-
- if (idx < (nxtindex = NEXTINDEX(h)))
- memmove(h->linp + idx + 1, h->linp + idx,
- (nxtindex - idx) * sizeof(indx_t));
- h->lower += sizeof(indx_t);
-
- h->linp[idx] = h->upper -= nbytes;
- dest = (char *)h + h->upper;
- WR_BLEAF(dest, key, data, dflags);
-
- /* If the cursor is on this page, adjust it as necessary. */
- if (F_ISSET(&t->bt_cursor, CURS_INIT) &&
- !F_ISSET(&t->bt_cursor, CURS_ACQUIRE) &&
- t->bt_cursor.pg.pgno == h->pgno && t->bt_cursor.pg.index >= idx)
- ++t->bt_cursor.pg.index;
-
- if (t->bt_order == NOT) {
- if (h->nextpg == P_INVALID) {
- if (idx == NEXTINDEX(h) - 1) {
- t->bt_order = FORWARD;
- t->bt_last.index = idx;
- t->bt_last.pgno = h->pgno;
- }
- } else if (h->prevpg == P_INVALID) {
- if (idx == 0) {
- t->bt_order = BACK;
- t->bt_last.index = 0;
- t->bt_last.pgno = h->pgno;
- }
- }
- }
-
- mpool_put(t->bt_mp, h, MPOOL_DIRTY);
-
-success:
- if (flags == R_SETCURSOR)
- __bt_setcur(t, e->page->pgno, e->index);
-
- F_SET(t, B_MODIFIED);
- return (RET_SUCCESS);
-}
-
-#ifdef STATISTICS
-u_long bt_cache_hit, bt_cache_miss;
-#endif
-
-/*
- * BT_FAST -- Do a quick check for sorted data.
- *
- * Parameters:
- * t: tree
- * key: key to insert
- *
- * Returns:
- * EPG for new record or NULL if not found.
- */
-static EPG *
-bt_fast(t, key, data, exactp)
- BTREE *t;
- const DBT *key, *data;
- int *exactp;
-{
- PAGE *h;
- u_int32_t nbytes;
- int cmp;
-
- if ((h = mpool_get(t->bt_mp, t->bt_last.pgno, 0)) == NULL) {
- t->bt_order = NOT;
- return (NULL);
- }
- t->bt_cur.page = h;
- t->bt_cur.index = t->bt_last.index;
-
- /*
- * If won't fit in this page or have too many keys in this page,
- * have to search to get split stack.
- */
- nbytes = NBLEAFDBT(key->size, data->size);
- if (h->upper - h->lower < nbytes + sizeof(indx_t))
- goto miss;
-
- if (t->bt_order == FORWARD) {
- if (t->bt_cur.page->nextpg != P_INVALID)
- goto miss;
- if (t->bt_cur.index != NEXTINDEX(h) - 1)
- goto miss;
- if ((cmp = __bt_cmp(t, key, &t->bt_cur)) < 0)
- goto miss;
- t->bt_last.index = cmp ? ++t->bt_cur.index : t->bt_cur.index;
- } else {
- if (t->bt_cur.page->prevpg != P_INVALID)
- goto miss;
- if (t->bt_cur.index != 0)
- goto miss;
- if ((cmp = __bt_cmp(t, key, &t->bt_cur)) > 0)
- goto miss;
- t->bt_last.index = 0;
- }
- *exactp = cmp == 0;
-#ifdef STATISTICS
- ++bt_cache_hit;
-#endif
- return (&t->bt_cur);
-
-miss:
-#ifdef STATISTICS
- ++bt_cache_miss;
-#endif
- t->bt_order = NOT;
- mpool_put(t->bt_mp, h, 0);
- return (NULL);
-}
diff --git a/src/util/db2/btree/bt_search.c b/src/util/db2/btree/bt_search.c
deleted file mode 100644
index de7ab126f9..0000000000
--- a/src/util/db2/btree/bt_search.c
+++ /dev/null
@@ -1,297 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Mike Olson.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)bt_search.c 8.9 (Berkeley) 10/26/95";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-
-#include <stdio.h>
-
-#include "db-int.h"
-#include "btree.h"
-
-static int __bt_snext __P((BTREE *, PAGE *, const DBT *, int *));
-static int __bt_sprev __P((BTREE *, PAGE *, const DBT *, int *));
-
-/*
- * __bt_search --
- * Search a btree for a key.
- *
- * Parameters:
- * t: tree to search
- * key: key to find
- * exactp: pointer to exact match flag
- *
- * Returns:
- * The EPG for matching record, if any, or the EPG for the location
- * of the key, if it were inserted into the tree, is entered into
- * the bt_cur field of the tree. A pointer to the field is returned.
- */
-EPG *
-__bt_search(t, key, exactp)
- BTREE *t;
- const DBT *key;
- int *exactp;
-{
- PAGE *h;
- indx_t base, idx, lim;
- db_pgno_t pg;
- int cmp;
-
- BT_CLR(t);
- for (pg = P_ROOT;;) {
- if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
- return (NULL);
-
- /* Do a binary search on the current page. */
- t->bt_cur.page = h;
- for (base = 0, lim = NEXTINDEX(h); lim; lim >>= 1) {
- t->bt_cur.index = idx = base + (lim >> 1);
- if ((cmp = __bt_cmp(t, key, &t->bt_cur)) == 0) {
- if (h->flags & P_BLEAF) {
- *exactp = 1;
- return (&t->bt_cur);
- }
- goto next;
- }
- if (cmp > 0) {
- base = idx + 1;
- --lim;
- }
- }
-
- /*
- * If it's a leaf page, we're almost done. If no duplicates
- * are allowed, or we have an exact match, we're done. Else,
- * it's possible that there were matching keys on this page,
- * which later deleted, and we're on a page with no matches
- * while there are matches on other pages. If at the start or
- * end of a page, check the adjacent page.
- */
- if (h->flags & P_BLEAF) {
- if (!F_ISSET(t, B_NODUPS)) {
- if (base == 0 &&
- h->prevpg != P_INVALID &&
- __bt_sprev(t, h, key, exactp))
- return (&t->bt_cur);
- if (base == NEXTINDEX(h) &&
- h->nextpg != P_INVALID &&
- __bt_snext(t, h, key, exactp))
- return (&t->bt_cur);
- }
- *exactp = 0;
- t->bt_cur.index = base;
- return (&t->bt_cur);
- }
-
- /*
- * No match found. Base is the smallest index greater than
- * key and may be zero or a last + 1 index. If it's non-zero,
- * decrement by one, and record the internal page which should
- * be a parent page for the key. If a split later occurs, the
- * inserted page will be to the right of the saved page.
- */
- idx = base ? base - 1 : base;
-
-next: BT_PUSH(t, h->pgno, idx);
- pg = GETBINTERNAL(h, idx)->pgno;
- mpool_put(t->bt_mp, h, 0);
- }
-}
-
-/*
- * __bt_snext --
- * Check for an exact match after the key.
- *
- * Parameters:
- * t: tree
- * h: current page
- * key: key
- * exactp: pointer to exact match flag
- *
- * Returns:
- * If an exact match found.
- */
-static int
-__bt_snext(t, h, key, exactp)
- BTREE *t;
- PAGE *h;
- const DBT *key;
- int *exactp;
-{
- BINTERNAL *bi;
- EPG e;
- EPGNO *parent;
- indx_t idx;
- db_pgno_t pgno;
- int level;
-
- /*
- * Get the next page. The key is either an exact
- * match, or not as good as the one we already have.
- */
- if ((e.page = mpool_get(t->bt_mp, h->nextpg, 0)) == NULL)
- return (0);
- e.index = 0;
- if (__bt_cmp(t, key, &e) != 0) {
- mpool_put(t->bt_mp, e.page, 0);
- return (0);
- }
- mpool_put(t->bt_mp, h, 0);
- t->bt_cur = e;
- *exactp = 1;
-
- /*
- * Adjust the stack for the movement.
- *
- * Move up the stack.
- */
- for (level = 0; (parent = BT_POP(t)) != NULL; ++level) {
- /* Get the parent page. */
- if ((h = mpool_get(t->bt_mp, parent->pgno, 0)) == NULL)
- return (0);
-
- /* Move to the next index. */
- if (parent->index != NEXTINDEX(h) - 1) {
- idx = parent->index + 1;
- BT_PUSH(t, h->pgno, idx);
- break;
- }
- mpool_put(t->bt_mp, h, 0);
- }
-
- /* Restore the stack. */
- while (level--) {
- /* Push the next level down onto the stack. */
- bi = GETBINTERNAL(h, idx);
- pgno = bi->pgno;
- BT_PUSH(t, pgno, 0);
-
- /* Lose the currently pinned page. */
- mpool_put(t->bt_mp, h, 0);
-
- /* Get the next level down. */
- if ((h = mpool_get(t->bt_mp, pgno, 0)) == NULL)
- return (0);
- idx = 0;
- }
- mpool_put(t->bt_mp, h, 0);
- return (1);
-}
-
-/*
- * __bt_sprev --
- * Check for an exact match before the key.
- *
- * Parameters:
- * t: tree
- * h: current page
- * key: key
- * exactp: pointer to exact match flag
- *
- * Returns:
- * If an exact match found.
- */
-static int
-__bt_sprev(t, h, key, exactp)
- BTREE *t;
- PAGE *h;
- const DBT *key;
- int *exactp;
-{
- BINTERNAL *bi;
- EPG e;
- EPGNO *parent;
- indx_t idx;
- db_pgno_t pgno;
- int level;
-
- /*
- * Get the previous page. The key is either an exact
- * match, or not as good as the one we already have.
- */
- if ((e.page = mpool_get(t->bt_mp, h->prevpg, 0)) == NULL)
- return (0);
- e.index = NEXTINDEX(e.page) - 1;
- if (__bt_cmp(t, key, &e) != 0) {
- mpool_put(t->bt_mp, e.page, 0);
- return (0);
- }
-
- mpool_put(t->bt_mp, h, 0);
- t->bt_cur = e;
- *exactp = 1;
-
- /*
- * Adjust the stack for the movement.
- *
- * Move up the stack.
- */
- for (level = 0; (parent = BT_POP(t)) != NULL; ++level) {
- /* Get the parent page. */
- if ((h = mpool_get(t->bt_mp, parent->pgno, 0)) == NULL)
- return (1);
-
- /* Move to the next index. */
- if (parent->index != 0) {
- idx = parent->index - 1;
- BT_PUSH(t, h->pgno, idx);
- break;
- }
- mpool_put(t->bt_mp, h, 0);
- }
-
- /* Restore the stack. */
- while (level--) {
- /* Push the next level down onto the stack. */
- bi = GETBINTERNAL(h, idx);
- pgno = bi->pgno;
-
- /* Lose the currently pinned page. */
- mpool_put(t->bt_mp, h, 0);
-
- /* Get the next level down. */
- if ((h = mpool_get(t->bt_mp, pgno, 0)) == NULL)
- return (1);
-
- idx = NEXTINDEX(h) - 1;
- BT_PUSH(t, pgno, idx);
- }
- mpool_put(t->bt_mp, h, 0);
- return (1);
-}
diff --git a/src/util/db2/btree/bt_seq.c b/src/util/db2/btree/bt_seq.c
deleted file mode 100644
index bbfb9c6c63..0000000000
--- a/src/util/db2/btree/bt_seq.c
+++ /dev/null
@@ -1,901 +0,0 @@
-/*
- * Copyright (C) 2002 by the Massachusetts Institute of Technology.
- * All rights reserved.
- *
- * Export of this software from the United States of America may
- * require a specific license from the United States Government.
- * It is the responsibility of any person or organization contemplating
- * export to obtain such a license before exporting.
- *
- * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
- * distribute this software and its documentation for any purpose and
- * without fee is hereby granted, provided that the above copyright
- * notice appear in all copies and that both that copyright notice and
- * this permission notice appear in supporting documentation, and that
- * the name of M.I.T. not be used in advertising or publicity pertaining
- * to distribution of the software without specific, written prior
- * permission. Furthermore if you modify this software you must label
- * your software as modified software and not distribute it in such a
- * fashion that it might be confused with the original M.I.T. software.
- * M.I.T. makes no representations about the suitability of
- * this software for any purpose. It is provided "as is" without express
- * or implied warranty.
- */
-
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Mike Olson.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)bt_seq.c 8.9 (Berkeley) 6/20/95";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-
-#include <errno.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "db-int.h"
-#include "btree.h"
-
-static int __bt_first __P((BTREE *, const DBT *, EPG *, int *));
-static int __bt_seqadv __P((BTREE *, EPG *, int));
-static int __bt_seqset __P((BTREE *, EPG *, DBT *, int));
-
-/*
- * Sequential scan support.
- *
- * The tree can be scanned sequentially, starting from either end of the
- * tree or from any specific key. A scan request before any scanning is
- * done is initialized as starting from the least node.
- */
-
-/*
- * __bt_seq --
- * Btree sequential scan interface.
- *
- * Parameters:
- * dbp: pointer to access method
- * key: key for positioning and return value
- * data: data return value
- * flags: R_CURSOR, R_FIRST, R_LAST, R_NEXT, R_PREV.
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS or RET_SPECIAL if there's no next key.
- */
-int
-__bt_seq(dbp, key, data, flags)
- const DB *dbp;
- DBT *key, *data;
- u_int flags;
-{
- BTREE *t;
- EPG e;
- int status;
-
- t = dbp->internal;
-
- /* Toss any page pinned across calls. */
- if (t->bt_pinned != NULL) {
- mpool_put(t->bt_mp, t->bt_pinned, 0);
- t->bt_pinned = NULL;
- }
-
- /*
- * If scan unitialized as yet, or starting at a specific record, set
- * the scan to a specific key. Both __bt_seqset and __bt_seqadv pin
- * the page the cursor references if they're successful.
- */
- switch (flags) {
- case R_NEXT:
- case R_PREV:
- if (F_ISSET(&t->bt_cursor, CURS_INIT)) {
- status = __bt_seqadv(t, &e, flags);
- break;
- }
- /* FALLTHROUGH */
- case R_FIRST:
- case R_LAST:
- case R_CURSOR:
- status = __bt_seqset(t, &e, key, flags);
- break;
- default:
- errno = EINVAL;
- return (RET_ERROR);
- }
-
- if (status == RET_SUCCESS) {
- __bt_setcur(t, e.page->pgno, e.index);
-
- status =
- __bt_ret(t, &e, key, &t->bt_rkey, data, &t->bt_rdata, 0);
-
- /*
- * If the user is doing concurrent access, we copied the
- * key/data, toss the page.
- */
- if (F_ISSET(t, B_DB_LOCK))
- mpool_put(t->bt_mp, e.page, 0);
- else
- t->bt_pinned = e.page;
- }
- return (status);
-}
-
-/*
- * __bt_seqset --
- * Set the sequential scan to a specific key.
- *
- * Parameters:
- * t: tree
- * ep: storage for returned key
- * key: key for initial scan position
- * flags: R_CURSOR, R_FIRST, R_LAST, R_NEXT, R_PREV
- *
- * Side effects:
- * Pins the page the cursor references.
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS or RET_SPECIAL if there's no next key.
- */
-static int
-__bt_seqset(t, ep, key, flags)
- BTREE *t;
- EPG *ep;
- DBT *key;
- int flags;
-{
- PAGE *h;
- db_pgno_t pg;
- int exact;
-
- /*
- * Find the first, last or specific key in the tree and point the
- * cursor at it. The cursor may not be moved until a new key has
- * been found.
- */
- switch (flags) {
- case R_CURSOR: /* Keyed scan. */
- /*
- * Find the first instance of the key or the smallest key
- * which is greater than or equal to the specified key.
- */
- if (key->data == NULL || key->size == 0) {
- errno = EINVAL;
- return (RET_ERROR);
- }
- return (__bt_first(t, key, ep, &exact));
- case R_FIRST: /* First record. */
- case R_NEXT:
- /* Walk down the left-hand side of the tree. */
- for (pg = P_ROOT;;) {
- if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
- return (RET_ERROR);
-
- /* Check for an empty tree. */
- if (NEXTINDEX(h) == 0) {
- mpool_put(t->bt_mp, h, 0);
- return (RET_SPECIAL);
- }
-
- if (h->flags & (P_BLEAF | P_RLEAF))
- break;
- pg = GETBINTERNAL(h, 0)->pgno;
- mpool_put(t->bt_mp, h, 0);
- }
- ep->page = h;
- ep->index = 0;
- break;
- case R_LAST: /* Last record. */
- case R_PREV:
- /* Walk down the right-hand side of the tree. */
- for (pg = P_ROOT;;) {
- if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
- return (RET_ERROR);
-
- /* Check for an empty tree. */
- if (NEXTINDEX(h) == 0) {
- mpool_put(t->bt_mp, h, 0);
- return (RET_SPECIAL);
- }
-
- if (h->flags & (P_BLEAF | P_RLEAF))
- break;
- pg = GETBINTERNAL(h, NEXTINDEX(h) - 1)->pgno;
- mpool_put(t->bt_mp, h, 0);
- }
-
- ep->page = h;
- ep->index = NEXTINDEX(h) - 1;
- break;
- }
- return (RET_SUCCESS);
-}
-
-/*
- * __bt_seqadvance --
- * Advance the sequential scan.
- *
- * Parameters:
- * t: tree
- * flags: R_NEXT, R_PREV
- *
- * Side effects:
- * Pins the page the new key/data record is on.
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS or RET_SPECIAL if there's no next key.
- */
-static int
-__bt_seqadv(t, ep, flags)
- BTREE *t;
- EPG *ep;
- int flags;
-{
- CURSOR *c;
- PAGE *h;
- indx_t idx;
- db_pgno_t pg;
- int exact, rval;
-
- /*
- * There are a couple of states that we can be in. The cursor has
- * been initialized by the time we get here, but that's all we know.
- */
- c = &t->bt_cursor;
-
- /*
- * The cursor was deleted and there weren't any duplicate records,
- * so the cursor's key was saved. Find out where that key would
- * be in the current tree. If the returned key is an exact match,
- * it means that a key/data pair was inserted into the tree after
- * the delete. We could reasonably return the key, but the problem
- * is that this is the access pattern we'll see if the user is
- * doing seq(..., R_NEXT)/put(..., 0) pairs, i.e. the put deletes
- * the cursor record and then replaces it, so the cursor was saved,
- * and we'll simply return the same "new" record until the user
- * notices and doesn't do a put() of it. Since the key is an exact
- * match, we could as easily put the new record before the cursor,
- * and we've made no guarantee to return it. So, move forward or
- * back a record if it's an exact match.
- *
- * XXX
- * In the current implementation, put's to the cursor are done with
- * delete/add pairs. This has two consequences. First, it means
- * that seq(..., R_NEXT)/put(..., R_CURSOR) pairs are going to exhibit
- * the same behavior as above. Second, you can return the same key
- * twice if you have duplicate records. The scenario is that the
- * cursor record is deleted, moving the cursor forward or backward
- * to a duplicate. The add then inserts the new record at a location
- * ahead of the cursor because duplicates aren't sorted in any way,
- * and the new record is later returned. This has to be fixed at some
- * point.
- */
- if (F_ISSET(c, CURS_ACQUIRE)) {
- if ((rval = __bt_first(t, &c->key, ep, &exact)) == RET_ERROR)
- return (RET_ERROR);
- if (!exact)
- return (rval);
- /*
- * XXX
- * Kluge -- get, release, get the page.
- */
- c->pg.pgno = ep->page->pgno;
- c->pg.index = ep->index;
- mpool_put(t->bt_mp, ep->page, 0);
- }
-
- /* Get the page referenced by the cursor. */
- if ((h = mpool_get(t->bt_mp, c->pg.pgno, 0)) == NULL)
- return (RET_ERROR);
-
- /*
- * Find the next/previous record in the tree and point the cursor at
- * it. The cursor may not be moved until a new key has been found.
- */
- switch (flags) {
- case R_NEXT: /* Next record. */
- /*
- * The cursor was deleted in duplicate records, and moved
- * forward to a record that has yet to be returned. Clear
- * that flag, and return the record.
- */
- if (F_ISSET(c, CURS_AFTER))
- goto usecurrent;
- idx = c->pg.index;
- if (++idx == NEXTINDEX(h)) {
- pg = h->nextpg;
- mpool_put(t->bt_mp, h, 0);
- if (pg == P_INVALID)
- return (RET_SPECIAL);
- if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
- return (RET_ERROR);
- idx = 0;
- }
- break;
- case R_PREV: /* Previous record. */
- /*
- * The cursor was deleted in duplicate records, and moved
- * backward to a record that has yet to be returned. Clear
- * that flag, and return the record.
- */
- if (F_ISSET(c, CURS_BEFORE)) {
-usecurrent: F_CLR(c, CURS_AFTER | CURS_BEFORE);
- ep->page = h;
- ep->index = c->pg.index;
- return (RET_SUCCESS);
- }
- idx = c->pg.index;
- if (idx == 0) {
- pg = h->prevpg;
- mpool_put(t->bt_mp, h, 0);
- if (pg == P_INVALID)
- return (RET_SPECIAL);
- if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
- return (RET_ERROR);
- idx = NEXTINDEX(h) - 1;
- } else
- --idx;
- break;
- }
-
- ep->page = h;
- ep->index = idx;
- return (RET_SUCCESS);
-}
-
-/*
- * __bt_first --
- * Find the first entry.
- *
- * Parameters:
- * t: the tree
- * key: the key
- * erval: return EPG
- * exactp: pointer to exact match flag
- *
- * Returns:
- * The first entry in the tree greater than or equal to key,
- * or RET_SPECIAL if no such key exists.
- */
-static int
-__bt_first(t, key, erval, exactp)
- BTREE *t;
- const DBT *key;
- EPG *erval;
- int *exactp;
-{
- PAGE *h;
- EPG *ep, save;
- db_pgno_t pg;
-
- /*
- * Find any matching record; __bt_search pins the page.
- *
- * If it's an exact match and duplicates are possible, walk backwards
- * in the tree until we find the first one. Otherwise, make sure it's
- * a valid key (__bt_search may return an index just past the end of a
- * page) and return it.
- */
- if ((ep = __bt_search(t, key, exactp)) == NULL)
- return (RET_SPECIAL);
- if (*exactp) {
- if (F_ISSET(t, B_NODUPS)) {
- *erval = *ep;
- return (RET_SUCCESS);
- }
-
- /*
- * Walk backwards, as long as the entry matches and there are
- * keys left in the tree. Save a copy of each match in case
- * we go too far.
- */
- save = *ep;
- h = ep->page;
- do {
- if (save.page->pgno != ep->page->pgno) {
- mpool_put(t->bt_mp, save.page, 0);
- save = *ep;
- } else
- save.index = ep->index;
-
- /*
- * Don't unpin the page the last (or original) match
- * was on, but make sure it's unpinned if an error
- * occurs.
- */
- if (ep->index == 0) {
- if (h->prevpg == P_INVALID)
- break;
- if (h->pgno != save.page->pgno)
- mpool_put(t->bt_mp, h, 0);
- if ((h = mpool_get(t->bt_mp,
- h->prevpg, 0)) == NULL) {
- if (h->pgno == save.page->pgno)
- mpool_put(t->bt_mp,
- save.page, 0);
- return (RET_ERROR);
- }
- ep->page = h;
- ep->index = NEXTINDEX(h);
- }
- --ep->index;
- } while (__bt_cmp(t, key, ep) == 0);
-
- /*
- * Reach here with the last page that was looked at pinned,
- * which may or may not be the same as the last (or original)
- * match page. If it's not useful, release it.
- */
- if (h->pgno != save.page->pgno)
- mpool_put(t->bt_mp, h, 0);
-
- *erval = save;
- return (RET_SUCCESS);
- }
-
- /* If at the end of a page, find the next entry. */
- if (ep->index == NEXTINDEX(ep->page)) {
- h = ep->page;
- pg = h->nextpg;
- mpool_put(t->bt_mp, h, 0);
- if (pg == P_INVALID)
- return (RET_SPECIAL);
- if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
- return (RET_ERROR);
- ep->index = 0;
- ep->page = h;
- }
- *erval = *ep;
- return (RET_SUCCESS);
-}
-
-/*
- * __bt_setcur --
- * Set the cursor to an entry in the tree.
- *
- * Parameters:
- * t: the tree
- * pgno: page number
- * index: page index
- */
-void
-__bt_setcur(t, pgno, idx)
- BTREE *t;
- db_pgno_t pgno;
- u_int idx;
-{
- /* Lose any already deleted key. */
- if (t->bt_cursor.key.data != NULL) {
- free(t->bt_cursor.key.data);
- t->bt_cursor.key.size = 0;
- t->bt_cursor.key.data = NULL;
- }
- F_CLR(&t->bt_cursor, CURS_ACQUIRE | CURS_AFTER | CURS_BEFORE);
-
- /* Update the cursor. */
- t->bt_cursor.pg.pgno = pgno;
- t->bt_cursor.pg.index = idx;
- F_SET(&t->bt_cursor, CURS_INIT);
-}
-
-/* Recursive descent cursor. */
-typedef struct rcursor_ {
- CURSOR cursor;
- size_t ssize;
- EPGNO *stack;
- EPGNO *sp;
-} RCURSOR;
-#define RCURSOR_MINSS 64
-
-static int bt_rcinit(void **);
-static void bt_rcdestroy(void **);
-static int bt_rcpush(RCURSOR *, db_pgno_t, u_int);
-static EPGNO *bt_rcpop(RCURSOR *);
-static void bt_rcclr(RCURSOR *);
-static int bt_rcgrowstk(RCURSOR *);
-static int bt_rseqset(BTREE *, EPG *, DBT *, RCURSOR *, int);
-static int bt_rseqadv(BTREE *, EPG *, RCURSOR *, int);
-
-static int
-bt_rcinit(curs)
- void **curs;
-{
- RCURSOR *rc;
-
- rc = *curs = malloc(sizeof(RCURSOR));
- if (rc == NULL) {
- errno = ENOMEM;
- return RET_ERROR;
- }
- memset(rc, 0, sizeof(*rc));
-
- rc->ssize = RCURSOR_MINSS;
- rc->stack = malloc(rc->ssize * sizeof(EPGNO));
- if (rc->stack == NULL) {
- free(rc);
- errno = ENOMEM;
- return RET_ERROR;
- }
- bt_rcclr(rc);
- return RET_SUCCESS;
-}
-
-static void
-bt_rcdestroy(curs)
- void **curs;
-{
- RCURSOR *rc;
-
- rc = *curs;
- free(rc->stack);
- free(rc);
- *curs = NULL;
-}
-
-static int
-bt_rcpush(rc, p, i)
- RCURSOR *rc;
- db_pgno_t p;
- u_int i;
-{
- int status;
-
- rc->sp->pgno = p;
- rc->sp->index = i;
- if (++rc->sp > rc->stack + rc->ssize) {
- status = bt_rcgrowstk(rc);
- if (status != RET_SUCCESS)
- return status;
- }
- return RET_SUCCESS;
-}
-
-static EPGNO *
-bt_rcpop(rc)
- RCURSOR *rc;
-{
- return (rc->sp == rc->stack) ? NULL : --rc->sp;
-}
-
-static void
-bt_rcclr(rc)
- RCURSOR *rc;
-{
- rc->sp = rc->stack;
-}
-
-static int
-bt_rcgrowstk(rc)
- RCURSOR *rc;
-{
- size_t osize;
- EPGNO *e;
-
- osize = rc->ssize;
- rc->ssize *= 2;
- e = realloc(rc->stack, rc->ssize * sizeof(EPGNO));
- if (e == NULL) {
- rc->ssize = osize;
- errno = ENOMEM;
- return RET_ERROR;
- }
- rc->stack = e;
- return RET_SUCCESS;
-}
-
-/*
- * bt_rseq --
- * Like __bt_seq but does recursive descent tree traversal
- * instead of using the prev/next pointers.
- */
-int
-bt_rseq(dbp, key, data, curs, flags)
- const DB *dbp;
- DBT *key, *data;
- void **curs;
- u_int flags;
-{
- RCURSOR *rc;
- BTREE *t;
- EPG e;
- int status;
-
- t = dbp->internal;
-
- /* Toss any page pinned across calls. */
- if (t->bt_pinned != NULL) {
- mpool_put(t->bt_mp, t->bt_pinned, 0);
- t->bt_pinned = NULL;
- }
-
- if (curs == NULL) {
- errno = EINVAL;
- return RET_ERROR;
- }
- if (*curs == NULL) {
- status = bt_rcinit(curs);
- if (status != RET_SUCCESS)
- return RET_ERROR;
- }
- rc = *curs;
-
- /*
- * If scan unitialized as yet, or starting at a specific record, set
- * the scan to a specific key. Both bt_rseqset and bt_rseqadv pin
- * the page the cursor references if they're successful.
- */
- switch (flags) {
- case R_NEXT:
- case R_PREV:
- if (F_ISSET(&rc->cursor, CURS_INIT)) {
- status = bt_rseqadv(t, &e, rc, flags);
- break;
- }
- /* FALLTHROUGH */
- case R_FIRST:
- case R_LAST:
- case R_CURSOR:
- status = bt_rseqset(t, &e, key, rc, flags);
- break;
- default:
- errno = EINVAL;
- return (RET_ERROR);
- }
-
- if (status == RET_SUCCESS) {
- status =
- __bt_ret(t, &e, key, &t->bt_rkey, data, &t->bt_rdata, 0);
-
- /*
- * If the user is doing concurrent access, we copied the
- * key/data, toss the page.
- */
- if (F_ISSET(t, B_DB_LOCK))
- mpool_put(t->bt_mp, e.page, 0);
- else
- t->bt_pinned = e.page;
- } else if (status == RET_SPECIAL)
- bt_rcdestroy(curs);
- return (status);
-}
-
-/*
- * bt_rseqset --
- * Set the sequential scan to a specific key.
- *
- * Parameters:
- * t: tree
- * ep: storage for returned key
- * key: key for initial scan position
- * rc: recursion cursor
- * flags: R_CURSOR, R_FIRST, R_LAST, R_NEXT, R_PREV
- *
- * Side effects:
- * Pins the page the cursor references.
- * Updates rc's stack and cursor.
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS or RET_SPECIAL if there's no next key.
- */
-static int
-bt_rseqset(t, ep, key, rc, flags)
- BTREE *t;
- EPG *ep;
- DBT *key;
- RCURSOR *rc;
- int flags;
-{
- PAGE *h;
- db_pgno_t pg;
- int status;
-
- /*
- * Find the first, last or specific key in the tree and point the
- * cursor at it. The cursor may not be moved until a new key has
- * been found.
- */
- switch (flags) {
- case R_CURSOR: /* Not implemented. */
- errno = EINVAL;
- return RET_ERROR;
- case R_FIRST: /* First record. */
- case R_NEXT:
- bt_rcclr(rc);
- /* Walk down the left-hand side of the tree. */
- for (pg = P_ROOT;;) {
- if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
- return (RET_ERROR);
-
- /* Check for an empty tree. */
- if (NEXTINDEX(h) == 0) {
- mpool_put(t->bt_mp, h, 0);
- return (RET_SPECIAL);
- }
-
- if (h->flags & (P_BLEAF | P_RLEAF))
- break;
- pg = GETBINTERNAL(h, 0)->pgno;
- status = bt_rcpush(rc, h->pgno, 0);
- mpool_put(t->bt_mp, h, 0);
- if (status != RET_SUCCESS)
- return status;
- }
- ep->page = h;
- ep->index = 0;
- break;
- case R_LAST: /* Last record. */
- case R_PREV:
- bt_rcclr(rc);
- /* Walk down the right-hand side of the tree. */
- for (pg = P_ROOT;;) {
- if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
- return (RET_ERROR);
-
- /* Check for an empty tree. */
- if (NEXTINDEX(h) == 0) {
- mpool_put(t->bt_mp, h, 0);
- return (RET_SPECIAL);
- }
-
- if (h->flags & (P_BLEAF | P_RLEAF))
- break;
- pg = GETBINTERNAL(h, NEXTINDEX(h) - 1)->pgno;
- status = bt_rcpush(rc, h->pgno, NEXTINDEX(h) - 1);
- mpool_put(t->bt_mp, h, 0);
- if (status != RET_SUCCESS)
- return status;
- }
- ep->page = h;
- ep->index = NEXTINDEX(h) - 1;
- break;
- }
- rc->cursor.pg.pgno = ep->page->pgno;
- rc->cursor.pg.index = ep->index;
- F_CLR(&rc->cursor, CURS_ACQUIRE | CURS_AFTER | CURS_BEFORE);
- F_SET(&rc->cursor, CURS_INIT);
- return (RET_SUCCESS);
-}
-
-/*
- * bt_rseqadvance --
- * Advance the sequential scan.
- *
- * Parameters:
- * t: tree
- * ep: return page
- * rc: recursion cursor
- * flags: R_NEXT, R_PREV
- *
- * Side effects:
- * Pins the page the new key/data record is on.
- * Updates rc's stack and cursor.
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS or RET_SPECIAL if there's no next key.
- */
-static int
-bt_rseqadv(t, ep, rc, flags)
- BTREE *t;
- EPG *ep;
- RCURSOR *rc;
- int flags;
-{
- CURSOR *c;
- PAGE *h;
- indx_t idx;
- db_pgno_t pg;
- int status;
- EPGNO *e;
-
- /*
- * There are a couple of states that we can be in. The cursor has
- * been initialized by the time we get here, but that's all we know.
- */
- c = &rc->cursor;
-
- /* Get the page referenced by the cursor. */
- if ((h = mpool_get(t->bt_mp, c->pg.pgno, 0)) == NULL)
- return (RET_ERROR);
-
- /*
- * Find the next/previous record in the tree and point the cursor at
- * it. The cursor may not be moved until a new key has been found.
- */
- switch (flags) {
- case R_NEXT: /* Next record. */
- idx = c->pg.index;
- while (++idx == NEXTINDEX(h)) {
- /* Crawl up if we hit the right edge. */
- e = bt_rcpop(rc);
- mpool_put(t->bt_mp, h, 0);
- if (e == NULL) /* Hit the right edge of root. */
- return RET_SPECIAL;
- idx = e->index;
- pg = e->pgno;
- if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
- return (RET_ERROR);
- }
- while (!(h->flags & (P_BLEAF | P_RLEAF))) {
- /* Crawl down the left until we hit a leaf. */
- status = bt_rcpush(rc, h->pgno, idx);
- pg = GETBINTERNAL(h, idx)->pgno;
- mpool_put(t->bt_mp, h, 0);
- if (status != RET_SUCCESS)
- return status;
- if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
- return (RET_ERROR);
- idx = 0;
- }
- break;
- case R_PREV: /* Previous record. */
- idx = c->pg.index;
- while (!idx) {
- /* Crawl up if we hit the left edge. */
- e = bt_rcpop(rc);
- mpool_put(t->bt_mp, h, 0);
- if (e == NULL) /* Hit the left edge of root. */
- return RET_SPECIAL;
- idx = e->index;
- pg = e->pgno;
- if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
- return (RET_ERROR);
- }
- idx--;
- while (!(h->flags & (P_BLEAF | P_RLEAF))) {
- /* Crawl down the right until we hit a leaf. */
- status = bt_rcpush(rc, h->pgno, idx);
- pg = GETBINTERNAL(h, idx)->pgno;
- mpool_put(t->bt_mp, h, 0);
- if (status != RET_SUCCESS)
- return status;
- if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
- return (RET_ERROR);
- idx = NEXTINDEX(h) - 1;
- }
- break;
- }
-
- ep->page = h;
- ep->index = idx;
- c->pg.pgno = h->pgno;
- c->pg.index = idx;
- F_CLR(c, CURS_ACQUIRE | CURS_AFTER | CURS_BEFORE);
- F_SET(c, CURS_INIT);
- return (RET_SUCCESS);
-}
diff --git a/src/util/db2/btree/bt_split.c b/src/util/db2/btree/bt_split.c
deleted file mode 100644
index 0cc6cf09bc..0000000000
--- a/src/util/db2/btree/bt_split.c
+++ /dev/null
@@ -1,828 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Mike Olson.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)bt_split.c 8.10 (Berkeley) 1/9/95";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "db-int.h"
-#include "btree.h"
-
-static int bt_broot __P((BTREE *, PAGE *, PAGE *, PAGE *));
-static PAGE *bt_page
- __P((BTREE *, PAGE *, PAGE **, PAGE **, indx_t *, size_t));
-static int bt_preserve __P((BTREE *, db_pgno_t));
-static PAGE *bt_psplit
- __P((BTREE *, PAGE *, PAGE *, PAGE *, indx_t *, size_t));
-static PAGE *bt_root
- __P((BTREE *, PAGE *, PAGE **, PAGE **, indx_t *, size_t));
-static int bt_rroot __P((BTREE *, PAGE *, PAGE *, PAGE *));
-static recno_t rec_total __P((PAGE *));
-
-#ifdef STATISTICS
-u_long bt_rootsplit, bt_split, bt_sortsplit, bt_pfxsaved;
-#endif
-
-/*
- * __BT_SPLIT -- Split the tree.
- *
- * Parameters:
- * t: tree
- * sp: page to split
- * key: key to insert
- * data: data to insert
- * flags: BIGKEY/BIGDATA flags
- * ilen: insert length
- * skip: index to leave open
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS
- */
-int
-__bt_split(t, sp, key, data, flags, ilen, argskip)
- BTREE *t;
- PAGE *sp;
- const DBT *key, *data;
- int flags;
- size_t ilen;
- u_int32_t argskip;
-{
- BINTERNAL *bi;
- BLEAF *bl, *tbl;
- DBT a, b;
- EPGNO *parent;
- PAGE *h, *l, *r, *lchild, *rchild;
- indx_t nxtindex;
- u_int16_t skip;
- u_int32_t n, nbytes, nksize;
- int parentsplit;
- char *dest;
-
- /*
- * Split the page into two pages, l and r. The split routines return
- * a pointer to the page into which the key should be inserted and with
- * skip set to the offset which should be used. Additionally, l and r
- * are pinned.
- */
- skip = argskip;
- h = sp->pgno == P_ROOT ?
- bt_root(t, sp, &l, &r, &skip, ilen) :
- bt_page(t, sp, &l, &r, &skip, ilen);
- if (h == NULL)
- return (RET_ERROR);
-
- /*
- * Insert the new key/data pair into the leaf page. (Key inserts
- * always cause a leaf page to split first.)
- */
- h->linp[skip] = h->upper -= ilen;
- dest = (char *)h + h->upper;
- if (F_ISSET(t, R_RECNO))
- WR_RLEAF(dest, data, flags)
- else
- WR_BLEAF(dest, key, data, flags)
-
- /* If the root page was split, make it look right. */
- if (sp->pgno == P_ROOT &&
- (F_ISSET(t, R_RECNO) ?
- bt_rroot(t, sp, l, r) : bt_broot(t, sp, l, r)) == RET_ERROR)
- goto err2;
-
- /*
- * Now we walk the parent page stack -- a LIFO stack of the pages that
- * were traversed when we searched for the page that split. Each stack
- * entry is a page number and a page index offset. The offset is for
- * the page traversed on the search. We've just split a page, so we
- * have to insert a new key into the parent page.
- *
- * If the insert into the parent page causes it to split, may have to
- * continue splitting all the way up the tree. We stop if the root
- * splits or the page inserted into didn't have to split to hold the
- * new key. Some algorithms replace the key for the old page as well
- * as the new page. We don't, as there's no reason to believe that the
- * first key on the old page is any better than the key we have, and,
- * in the case of a key being placed at index 0 causing the split, the
- * key is unavailable.
- *
- * There are a maximum of 5 pages pinned at any time. We keep the left
- * and right pages pinned while working on the parent. The 5 are the
- * two children, left parent and right parent (when the parent splits)
- * and the root page or the overflow key page when calling bt_preserve.
- * This code must make sure that all pins are released other than the
- * root page or overflow page which is unlocked elsewhere.
- */
- while ((parent = BT_POP(t)) != NULL) {
- lchild = l;
- rchild = r;
-
- /* Get the parent page. */
- if ((h = mpool_get(t->bt_mp, parent->pgno, 0)) == NULL)
- goto err2;
-
- /*
- * The new key goes ONE AFTER the index, because the split
- * was to the right.
- */
- skip = parent->index + 1;
-
- /*
- * Calculate the space needed on the parent page.
- *
- * Prefix trees: space hack when inserting into BINTERNAL
- * pages. Retain only what's needed to distinguish between
- * the new entry and the LAST entry on the page to its left.
- * If the keys compare equal, retain the entire key. Note,
- * we don't touch overflow keys, and the entire key must be
- * retained for the next-to-left most key on the leftmost
- * page of each level, or the search will fail. Applicable
- * ONLY to internal pages that have leaf pages as children.
- * Further reduction of the key between pairs of internal
- * pages loses too much information.
- */
- switch (rchild->flags & P_TYPE) {
- case P_BINTERNAL:
- bi = GETBINTERNAL(rchild, 0);
- nbytes = NBINTERNAL(bi->ksize);
- break;
- case P_BLEAF:
- bl = GETBLEAF(rchild, 0);
- nbytes = NBINTERNAL(bl->ksize);
- if (t->bt_pfx && !(bl->flags & P_BIGKEY) &&
- (h->prevpg != P_INVALID || skip > 1)) {
- tbl = GETBLEAF(lchild, NEXTINDEX(lchild) - 1);
- a.size = tbl->ksize;
- a.data = tbl->bytes;
- b.size = bl->ksize;
- b.data = bl->bytes;
- nksize = t->bt_pfx(&a, &b);
- n = NBINTERNAL(nksize);
- if (n < nbytes) {
-#ifdef STATISTICS
- bt_pfxsaved += nbytes - n;
-#endif
- nbytes = n;
- } else
- nksize = 0;
- } else
- nksize = 0;
- break;
- case P_RINTERNAL:
- case P_RLEAF:
- nbytes = NRINTERNAL;
- break;
- default:
- abort();
- }
-
- /* Split the parent page if necessary or shift the indices. */
- if (h->upper - h->lower < nbytes + sizeof(indx_t)) {
- sp = h;
- h = h->pgno == P_ROOT ?
- bt_root(t, h, &l, &r, &skip, nbytes) :
- bt_page(t, h, &l, &r, &skip, nbytes);
- if (h == NULL)
- goto err1;
- parentsplit = 1;
- } else {
- if (skip < (nxtindex = NEXTINDEX(h)))
- memmove(h->linp + skip + 1, h->linp + skip,
- (nxtindex - skip) * sizeof(indx_t));
- h->lower += sizeof(indx_t);
- parentsplit = 0;
- }
-
- /* Insert the key into the parent page. */
- switch (rchild->flags & P_TYPE) {
- case P_BINTERNAL:
- h->linp[skip] = h->upper -= nbytes;
- dest = (char *)h + h->linp[skip];
- memmove(dest, bi, nbytes);
- ((BINTERNAL *)dest)->pgno = rchild->pgno;
- break;
- case P_BLEAF:
- h->linp[skip] = h->upper -= nbytes;
- dest = (char *)h + h->linp[skip];
- WR_BINTERNAL(dest, nksize ? nksize : bl->ksize,
- rchild->pgno, bl->flags & P_BIGKEY);
- memmove(dest, bl->bytes, nksize ? nksize : bl->ksize);
- if (bl->flags & P_BIGKEY &&
- bt_preserve(t, *(db_pgno_t *)bl->bytes) == RET_ERROR)
- goto err1;
- break;
- case P_RINTERNAL:
- /*
- * Update the left page count. If split
- * added at index 0, fix the correct page.
- */
- if (skip > 0)
- dest = (char *)h + h->linp[skip - 1];
- else
- dest = (char *)l + l->linp[NEXTINDEX(l) - 1];
- ((RINTERNAL *)dest)->nrecs = rec_total(lchild);
- ((RINTERNAL *)dest)->pgno = lchild->pgno;
-
- /* Update the right page count. */
- h->linp[skip] = h->upper -= nbytes;
- dest = (char *)h + h->linp[skip];
- ((RINTERNAL *)dest)->nrecs = rec_total(rchild);
- ((RINTERNAL *)dest)->pgno = rchild->pgno;
- break;
- case P_RLEAF:
- /*
- * Update the left page count. If split
- * added at index 0, fix the correct page.
- */
- if (skip > 0)
- dest = (char *)h + h->linp[skip - 1];
- else
- dest = (char *)l + l->linp[NEXTINDEX(l) - 1];
- ((RINTERNAL *)dest)->nrecs = NEXTINDEX(lchild);
- ((RINTERNAL *)dest)->pgno = lchild->pgno;
-
- /* Update the right page count. */
- h->linp[skip] = h->upper -= nbytes;
- dest = (char *)h + h->linp[skip];
- ((RINTERNAL *)dest)->nrecs = NEXTINDEX(rchild);
- ((RINTERNAL *)dest)->pgno = rchild->pgno;
- break;
- default:
- abort();
- }
-
- /* Unpin the held pages. */
- if (!parentsplit) {
- mpool_put(t->bt_mp, h, MPOOL_DIRTY);
- break;
- }
-
- /* If the root page was split, make it look right. */
- if (sp->pgno == P_ROOT &&
- (F_ISSET(t, R_RECNO) ?
- bt_rroot(t, sp, l, r) : bt_broot(t, sp, l, r)) == RET_ERROR)
- goto err1;
-
- mpool_put(t->bt_mp, lchild, MPOOL_DIRTY);
- mpool_put(t->bt_mp, rchild, MPOOL_DIRTY);
- }
-
- /* Unpin the held pages. */
- mpool_put(t->bt_mp, l, MPOOL_DIRTY);
- mpool_put(t->bt_mp, r, MPOOL_DIRTY);
-
- /* Clear any pages left on the stack. */
- return (RET_SUCCESS);
-
- /*
- * If something fails in the above loop we were already walking back
- * up the tree and the tree is now inconsistent. Nothing much we can
- * do about it but release any memory we're holding.
- */
-err1: mpool_put(t->bt_mp, lchild, MPOOL_DIRTY);
- mpool_put(t->bt_mp, rchild, MPOOL_DIRTY);
-
-err2: mpool_put(t->bt_mp, l, 0);
- mpool_put(t->bt_mp, r, 0);
- __dbpanic(t->bt_dbp);
- return (RET_ERROR);
-}
-
-/*
- * BT_PAGE -- Split a non-root page of a btree.
- *
- * Parameters:
- * t: tree
- * h: root page
- * lp: pointer to left page pointer
- * rp: pointer to right page pointer
- * skip: pointer to index to leave open
- * ilen: insert length
- *
- * Returns:
- * Pointer to page in which to insert or NULL on error.
- */
-static PAGE *
-bt_page(t, h, lp, rp, skip, ilen)
- BTREE *t;
- PAGE *h, **lp, **rp;
- indx_t *skip;
- size_t ilen;
-{
- PAGE *l, *r, *tp;
- db_pgno_t npg;
-
-#ifdef STATISTICS
- ++bt_split;
-#endif
- /* Put the new right page for the split into place. */
- if ((r = __bt_new(t, &npg)) == NULL)
- return (NULL);
- r->pgno = npg;
- r->lower = BTDATAOFF;
- r->upper = t->bt_psize;
- r->nextpg = h->nextpg;
- r->prevpg = h->pgno;
- r->flags = h->flags & P_TYPE;
-
- /*
- * If we're splitting the last page on a level because we're appending
- * a key to it (skip is NEXTINDEX()), it's likely that the data is
- * sorted. Adding an empty page on the side of the level is less work
- * and can push the fill factor much higher than normal. If we're
- * wrong it's no big deal, we'll just do the split the right way next
- * time. It may look like it's equally easy to do a similar hack for
- * reverse sorted data, that is, split the tree left, but it's not.
- * Don't even try.
- */
- if (h->nextpg == P_INVALID && *skip == NEXTINDEX(h)) {
-#ifdef STATISTICS
- ++bt_sortsplit;
-#endif
- h->nextpg = r->pgno;
- r->lower = BTDATAOFF + sizeof(indx_t);
- *skip = 0;
- *lp = h;
- *rp = r;
- return (r);
- }
-
- /* Put the new left page for the split into place. */
- if ((l = (PAGE *)malloc(t->bt_psize)) == NULL) {
- mpool_put(t->bt_mp, r, 0);
- return (NULL);
- }
-#ifdef PURIFY
- memset(l, 0xff, t->bt_psize);
-#endif
- l->pgno = h->pgno;
- l->nextpg = r->pgno;
- l->prevpg = h->prevpg;
- l->lower = BTDATAOFF;
- l->upper = t->bt_psize;
- l->flags = h->flags & P_TYPE;
-
- /* Fix up the previous pointer of the page after the split page. */
- if (h->nextpg != P_INVALID) {
- if ((tp = mpool_get(t->bt_mp, h->nextpg, 0)) == NULL) {
- free(l);
- /* XXX mpool_free(t->bt_mp, r->pgno); */
- return (NULL);
- }
- tp->prevpg = r->pgno;
- mpool_put(t->bt_mp, tp, MPOOL_DIRTY);
- }
-
- /*
- * Split right. The key/data pairs aren't sorted in the btree page so
- * it's simpler to copy the data from the split page onto two new pages
- * instead of copying half the data to the right page and compacting
- * the left page in place. Since the left page can't change, we have
- * to swap the original and the allocated left page after the split.
- */
- tp = bt_psplit(t, h, l, r, skip, ilen);
-
- /* Move the new left page onto the old left page. */
- memmove(h, l, t->bt_psize);
- if (tp == l)
- tp = h;
- free(l);
-
- *lp = h;
- *rp = r;
- return (tp);
-}
-
-/*
- * BT_ROOT -- Split the root page of a btree.
- *
- * Parameters:
- * t: tree
- * h: root page
- * lp: pointer to left page pointer
- * rp: pointer to right page pointer
- * skip: pointer to index to leave open
- * ilen: insert length
- *
- * Returns:
- * Pointer to page in which to insert or NULL on error.
- */
-static PAGE *
-bt_root(t, h, lp, rp, skip, ilen)
- BTREE *t;
- PAGE *h, **lp, **rp;
- indx_t *skip;
- size_t ilen;
-{
- PAGE *l, *r, *tp;
- db_pgno_t lnpg, rnpg;
-
-#ifdef STATISTICS
- ++bt_split;
- ++bt_rootsplit;
-#endif
- /* Put the new left and right pages for the split into place. */
- if ((l = __bt_new(t, &lnpg)) == NULL ||
- (r = __bt_new(t, &rnpg)) == NULL)
- return (NULL);
- l->pgno = lnpg;
- r->pgno = rnpg;
- l->nextpg = r->pgno;
- r->prevpg = l->pgno;
- l->prevpg = r->nextpg = P_INVALID;
- l->lower = r->lower = BTDATAOFF;
- l->upper = r->upper = t->bt_psize;
- l->flags = r->flags = h->flags & P_TYPE;
-
- /* Split the root page. */
- tp = bt_psplit(t, h, l, r, skip, ilen);
-
- *lp = l;
- *rp = r;
- return (tp);
-}
-
-/*
- * BT_RROOT -- Fix up the recno root page after it has been split.
- *
- * Parameters:
- * t: tree
- * h: root page
- * l: left page
- * r: right page
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS
- */
-static int
-bt_rroot(t, h, l, r)
- BTREE *t;
- PAGE *h, *l, *r;
-{
- char *dest;
-
- /* Insert the left and right keys, set the header information. */
- h->linp[0] = h->upper = t->bt_psize - NRINTERNAL;
- dest = (char *)h + h->upper;
- WR_RINTERNAL(dest,
- l->flags & P_RLEAF ? NEXTINDEX(l) : rec_total(l), l->pgno);
-
- h->linp[1] = h->upper -= NRINTERNAL;
- dest = (char *)h + h->upper;
- WR_RINTERNAL(dest,
- r->flags & P_RLEAF ? NEXTINDEX(r) : rec_total(r), r->pgno);
-
- h->lower = BTDATAOFF + 2 * sizeof(indx_t);
-
- /* Unpin the root page, set to recno internal page. */
- h->flags &= ~P_TYPE;
- h->flags |= P_RINTERNAL;
- mpool_put(t->bt_mp, h, MPOOL_DIRTY);
-
- return (RET_SUCCESS);
-}
-
-/*
- * BT_BROOT -- Fix up the btree root page after it has been split.
- *
- * Parameters:
- * t: tree
- * h: root page
- * l: left page
- * r: right page
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS
- */
-static int
-bt_broot(t, h, l, r)
- BTREE *t;
- PAGE *h, *l, *r;
-{
- BINTERNAL *bi;
- BLEAF *bl;
- u_int32_t nbytes;
- char *dest;
-
- /*
- * If the root page was a leaf page, change it into an internal page.
- * We copy the key we split on (but not the key's data, in the case of
- * a leaf page) to the new root page.
- *
- * The btree comparison code guarantees that the left-most key on any
- * level of the tree is never used, so it doesn't need to be filled in.
- */
- nbytes = NBINTERNAL(0);
- h->linp[0] = h->upper = t->bt_psize - nbytes;
- dest = (char *)h + h->upper;
- WR_BINTERNAL(dest, 0, l->pgno, 0);
-
- switch (h->flags & P_TYPE) {
- case P_BLEAF:
- bl = GETBLEAF(r, 0);
- nbytes = NBINTERNAL(bl->ksize);
- h->linp[1] = h->upper -= nbytes;
- dest = (char *)h + h->upper;
- WR_BINTERNAL(dest, bl->ksize, r->pgno, 0);
- memmove(dest, bl->bytes, bl->ksize);
-
- /*
- * If the key is on an overflow page, mark the overflow chain
- * so it isn't deleted when the leaf copy of the key is deleted.
- */
- if (bl->flags & P_BIGKEY &&
- bt_preserve(t, *(db_pgno_t *)bl->bytes) == RET_ERROR)
- return (RET_ERROR);
- break;
- case P_BINTERNAL:
- bi = GETBINTERNAL(r, 0);
- nbytes = NBINTERNAL(bi->ksize);
- h->linp[1] = h->upper -= nbytes;
- dest = (char *)h + h->upper;
- memmove(dest, bi, nbytes);
- ((BINTERNAL *)dest)->pgno = r->pgno;
- break;
- default:
- abort();
- }
-
- /* There are two keys on the page. */
- h->lower = BTDATAOFF + 2 * sizeof(indx_t);
-
- /* Unpin the root page, set to btree internal page. */
- h->flags &= ~P_TYPE;
- h->flags |= P_BINTERNAL;
- mpool_put(t->bt_mp, h, MPOOL_DIRTY);
-
- return (RET_SUCCESS);
-}
-
-/*
- * BT_PSPLIT -- Do the real work of splitting the page.
- *
- * Parameters:
- * t: tree
- * h: page to be split
- * l: page to put lower half of data
- * r: page to put upper half of data
- * pskip: pointer to index to leave open
- * ilen: insert length
- *
- * Returns:
- * Pointer to page in which to insert.
- */
-static PAGE *
-bt_psplit(t, h, l, r, pskip, ilen)
- BTREE *t;
- PAGE *h, *l, *r;
- indx_t *pskip;
- size_t ilen;
-{
- BINTERNAL *bi;
- BLEAF *bl;
- CURSOR *c;
- RLEAF *rl;
- PAGE *rval;
- void *src;
- indx_t full, half, nxt, off, skip, top, used;
- u_int32_t nbytes;
- int bigkeycnt, isbigkey;
-
- /*
- * Split the data to the left and right pages. Leave the skip index
- * open. Additionally, make some effort not to split on an overflow
- * key. This makes internal page processing faster and can save
- * space as overflow keys used by internal pages are never deleted.
- */
- bigkeycnt = 0;
- skip = *pskip;
- full = t->bt_psize - BTDATAOFF;
- half = full / 2;
- used = 0;
- for (nxt = off = 0, top = NEXTINDEX(h); nxt < top; ++off) {
- if (skip == off) {
- nbytes = ilen;
- isbigkey = 0; /* XXX: not really known. */
- } else
- switch (h->flags & P_TYPE) {
- case P_BINTERNAL:
- src = bi = GETBINTERNAL(h, nxt);
- nbytes = NBINTERNAL(bi->ksize);
- isbigkey = bi->flags & P_BIGKEY;
- break;
- case P_BLEAF:
- src = bl = GETBLEAF(h, nxt);
- nbytes = NBLEAF(bl);
- isbigkey = bl->flags & P_BIGKEY;
- break;
- case P_RINTERNAL:
- src = GETRINTERNAL(h, nxt);
- nbytes = NRINTERNAL;
- isbigkey = 0;
- break;
- case P_RLEAF:
- src = rl = GETRLEAF(h, nxt);
- nbytes = NRLEAF(rl);
- isbigkey = 0;
- break;
- default:
- abort();
- }
-
- /*
- * If the key/data pairs are substantial fractions of the max
- * possible size for the page, it's possible to get situations
- * where we decide to try and copy too much onto the left page.
- * Make sure that doesn't happen.
- */
- if ((skip <= off && used + nbytes + sizeof(indx_t) >= full)
- || nxt == top - 1) {
- --off;
- break;
- }
-
- /* Copy the key/data pair, if not the skipped index. */
- if (skip != off) {
- ++nxt;
-
- l->linp[off] = l->upper -= nbytes;
- memmove((char *)l + l->upper, src, nbytes);
- }
-
- used += nbytes + sizeof(indx_t);
- if (used >= half) {
- if (!isbigkey || bigkeycnt == 3)
- break;
- else
- ++bigkeycnt;
- }
- }
-
- /*
- * Off is the last offset that's valid for the left page.
- * Nxt is the first offset to be placed on the right page.
- */
- l->lower += (off + 1) * sizeof(indx_t);
-
- /*
- * If splitting the page that the cursor was on, the cursor has to be
- * adjusted to point to the same record as before the split. If the
- * cursor is at or past the skipped slot, the cursor is incremented by
- * one. If the cursor is on the right page, it is decremented by the
- * number of records split to the left page.
- */
- c = &t->bt_cursor;
- if (F_ISSET(c, CURS_INIT) && c->pg.pgno == h->pgno) {
- if (c->pg.index >= skip)
- ++c->pg.index;
- if (c->pg.index < nxt) /* Left page. */
- c->pg.pgno = l->pgno;
- else { /* Right page. */
- c->pg.pgno = r->pgno;
- c->pg.index -= nxt;
- }
- }
-
- /*
- * If the skipped index was on the left page, just return that page.
- * Otherwise, adjust the skip index to reflect the new position on
- * the right page.
- */
- if (skip <= off) {
- skip = 0;
- rval = l;
- } else {
- rval = r;
- *pskip -= nxt;
- }
-
- for (off = 0; nxt < top; ++off) {
- if (skip == nxt) {
- ++off;
- skip = 0;
- }
- switch (h->flags & P_TYPE) {
- case P_BINTERNAL:
- src = bi = GETBINTERNAL(h, nxt);
- nbytes = NBINTERNAL(bi->ksize);
- break;
- case P_BLEAF:
- src = bl = GETBLEAF(h, nxt);
- nbytes = NBLEAF(bl);
- break;
- case P_RINTERNAL:
- src = GETRINTERNAL(h, nxt);
- nbytes = NRINTERNAL;
- break;
- case P_RLEAF:
- src = rl = GETRLEAF(h, nxt);
- nbytes = NRLEAF(rl);
- break;
- default:
- abort();
- }
- ++nxt;
- r->linp[off] = r->upper -= nbytes;
- memmove((char *)r + r->upper, src, nbytes);
- }
- r->lower += off * sizeof(indx_t);
-
- /* If the key is being appended to the page, adjust the index. */
- if (skip == top)
- r->lower += sizeof(indx_t);
-
- return (rval);
-}
-
-/*
- * BT_PRESERVE -- Mark a chain of pages as used by an internal node.
- *
- * Chains of indirect blocks pointed to by leaf nodes get reclaimed when the
- * record that references them gets deleted. Chains pointed to by internal
- * pages never get deleted. This routine marks a chain as pointed to by an
- * internal page.
- *
- * Parameters:
- * t: tree
- * pg: page number of first page in the chain.
- *
- * Returns:
- * RET_SUCCESS, RET_ERROR.
- */
-static int
-bt_preserve(t, pg)
- BTREE *t;
- db_pgno_t pg;
-{
- PAGE *h;
-
- if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
- return (RET_ERROR);
- h->flags |= P_PRESERVE;
- mpool_put(t->bt_mp, h, MPOOL_DIRTY);
- return (RET_SUCCESS);
-}
-
-/*
- * REC_TOTAL -- Return the number of recno entries below a page.
- *
- * Parameters:
- * h: page
- *
- * Returns:
- * The number of recno entries below a page.
- *
- * XXX
- * These values could be set by the bt_psplit routine. The problem is that the
- * entry has to be popped off of the stack etc. or the values have to be passed
- * all the way back to bt_split/bt_rroot and it's not very clean.
- */
-static recno_t
-rec_total(h)
- PAGE *h;
-{
- recno_t recs;
- indx_t nxt, top;
-
- for (recs = 0, nxt = 0, top = NEXTINDEX(h); nxt < top; ++nxt)
- recs += GETRINTERNAL(h, nxt)->nrecs;
- return (recs);
-}
diff --git a/src/util/db2/btree/bt_utils.c b/src/util/db2/btree/bt_utils.c
deleted file mode 100644
index 1a34598ad6..0000000000
--- a/src/util/db2/btree/bt_utils.c
+++ /dev/null
@@ -1,260 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Mike Olson.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)bt_utils.c 8.8 (Berkeley) 7/20/94";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/param.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "db-int.h"
-#include "btree.h"
-
-/*
- * __bt_ret --
- * Build return key/data pair.
- *
- * Parameters:
- * t: tree
- * e: key/data pair to be returned
- * key: user's key structure (NULL if not to be filled in)
- * rkey: memory area to hold key
- * data: user's data structure (NULL if not to be filled in)
- * rdata: memory area to hold data
- * copy: always copy the key/data item
- *
- * Returns:
- * RET_SUCCESS, RET_ERROR.
- */
-int
-__bt_ret(t, e, key, rkey, data, rdata, copy)
- BTREE *t;
- EPG *e;
- DBT *key, *rkey, *data, *rdata;
- int copy;
-{
- BLEAF *bl;
- void *p;
-
- bl = GETBLEAF(e->page, e->index);
-
- /*
- * We must copy big keys/data to make them contigous. Otherwise,
- * leave the page pinned and don't copy unless the user specified
- * concurrent access.
- */
- if (key == NULL)
- goto dataonly;
-
- if (bl->flags & P_BIGKEY) {
- if (__ovfl_get(t, bl->bytes,
- &key->size, &rkey->data, &rkey->size))
- return (RET_ERROR);
- key->data = rkey->data;
- } else if (copy || F_ISSET(t, B_DB_LOCK)) {
- if (bl->ksize > rkey->size) {
- p = (void *)(rkey->data == NULL ?
- malloc(bl->ksize) : realloc(rkey->data, bl->ksize));
- if (p == NULL)
- return (RET_ERROR);
- rkey->data = p;
- rkey->size = bl->ksize;
- }
- memmove(rkey->data, bl->bytes, bl->ksize);
- key->size = bl->ksize;
- key->data = rkey->data;
- } else {
- key->size = bl->ksize;
- key->data = bl->bytes;
- }
-
-dataonly:
- if (data == NULL)
- return (RET_SUCCESS);
-
- if (bl->flags & P_BIGDATA) {
- if (__ovfl_get(t, bl->bytes + bl->ksize,
- &data->size, &rdata->data, &rdata->size))
- return (RET_ERROR);
- data->data = rdata->data;
- } else if (copy || F_ISSET(t, B_DB_LOCK)) {
- /* Use +1 in case the first record retrieved is 0 length. */
- if (bl->dsize + 1 > rdata->size) {
- p = (void *)(rdata->data == NULL ?
- malloc(bl->dsize + 1) :
- realloc(rdata->data, bl->dsize + 1));
- if (p == NULL)
- return (RET_ERROR);
- rdata->data = p;
- rdata->size = bl->dsize + 1;
- }
- memmove(rdata->data, bl->bytes + bl->ksize, bl->dsize);
- data->size = bl->dsize;
- data->data = rdata->data;
- } else {
- data->size = bl->dsize;
- data->data = bl->bytes + bl->ksize;
- }
-
- return (RET_SUCCESS);
-}
-
-/*
- * __BT_CMP -- Compare a key to a given record.
- *
- * Parameters:
- * t: tree
- * k1: DBT pointer of first arg to comparison
- * e: pointer to EPG for comparison
- *
- * Returns:
- * < 0 if k1 is < record
- * = 0 if k1 is = record
- * > 0 if k1 is > record
- */
-int
-__bt_cmp(t, k1, e)
- BTREE *t;
- const DBT *k1;
- EPG *e;
-{
- BINTERNAL *bi;
- BLEAF *bl;
- DBT k2;
- PAGE *h;
- void *bigkey;
-
- /*
- * The left-most key on internal pages, at any level of the tree, is
- * guaranteed by the following code to be less than any user key.
- * This saves us from having to update the leftmost key on an internal
- * page when the user inserts a new key in the tree smaller than
- * anything we've yet seen.
- */
- h = e->page;
- if (e->index == 0 && h->prevpg == P_INVALID && !(h->flags & P_BLEAF))
- return (1);
-
- bigkey = NULL;
- if (h->flags & P_BLEAF) {
- bl = GETBLEAF(h, e->index);
- if (bl->flags & P_BIGKEY)
- bigkey = bl->bytes;
- else {
- k2.data = bl->bytes;
- k2.size = bl->ksize;
- }
- } else {
- bi = GETBINTERNAL(h, e->index);
- if (bi->flags & P_BIGKEY)
- bigkey = bi->bytes;
- else {
- k2.data = bi->bytes;
- k2.size = bi->ksize;
- }
- }
-
- if (bigkey) {
- if (__ovfl_get(t, bigkey,
- &k2.size, &t->bt_rdata.data, &t->bt_rdata.size))
- return (RET_ERROR);
- k2.data = t->bt_rdata.data;
- }
- return ((*t->bt_cmp)(k1, &k2));
-}
-
-/*
- * __BT_DEFCMP -- Default comparison routine.
- *
- * Parameters:
- * a: DBT #1
- * b: DBT #2
- *
- * Returns:
- * < 0 if a is < b
- * = 0 if a is = b
- * > 0 if a is > b
- */
-int
-__bt_defcmp(a, b)
- const DBT *a, *b;
-{
- register size_t len;
- register u_char *p1, *p2;
-
- /*
- * XXX
- * If a size_t doesn't fit in an int, this routine can lose.
- * What we need is a integral type which is guaranteed to be
- * larger than a size_t, and there is no such thing.
- */
- len = MIN(a->size, b->size);
- for (p1 = a->data, p2 = b->data; len--; ++p1, ++p2)
- if (*p1 != *p2)
- return ((int)*p1 - (int)*p2);
- return ((int)a->size - (int)b->size);
-}
-
-/*
- * __BT_DEFPFX -- Default prefix routine.
- *
- * Parameters:
- * a: DBT #1
- * b: DBT #2
- *
- * Returns:
- * Number of bytes needed to distinguish b from a.
- */
-size_t
-__bt_defpfx(a, b)
- const DBT *a, *b;
-{
- register u_char *p1, *p2;
- register size_t cnt, len;
-
- cnt = 1;
- len = MIN(a->size, b->size);
- for (p1 = a->data, p2 = b->data; len--; ++p1, ++p2, ++cnt)
- if (*p1 != *p2)
- return (cnt);
-
- /* a->size must be <= b->size, or they wouldn't be in this order. */
- return (a->size < b->size ? a->size + 1 : a->size);
-}
diff --git a/src/util/db2/btree/btree.h b/src/util/db2/btree/btree.h
deleted file mode 100644
index 171712749f..0000000000
--- a/src/util/db2/btree/btree.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Mike Olson.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)btree.h 8.11 (Berkeley) 8/17/94
- */
-
-/* Macros to set/clear/test flags. */
-#define F_SET(p, f) (p)->flags |= (f)
-#define F_CLR(p, f) (p)->flags &= ~(f)
-#define F_ISSET(p, f) ((p)->flags & (f))
-
-#include "mpool.h"
-
-#define DEFMINKEYPAGE (2) /* Minimum keys per page */
-#define MINCACHE (5) /* Minimum cached pages */
-#define MINPSIZE (512) /* Minimum page size */
-
-/*
- * Page 0 of a btree file contains a copy of the meta-data. This page is also
- * used as an out-of-band page, i.e. page pointers that point to nowhere point
- * to page 0. Page 1 is the root of the btree.
- */
-#define P_INVALID 0 /* Invalid tree page number. */
-#define P_META 0 /* Tree metadata page number. */
-#define P_ROOT 1 /* Tree root page number. */
-
-/*
- * There are five page layouts in the btree: btree internal pages (BINTERNAL),
- * btree leaf pages (BLEAF), recno internal pages (RINTERNAL), recno leaf pages
- * (RLEAF) and overflow pages. All five page types have a page header (PAGE).
- * This implementation requires that values within structures NOT be padded.
- * (ANSI C permits random padding.) If your compiler pads randomly you'll have
- * to do some work to get this package to run.
- */
-typedef struct _page {
- db_pgno_t pgno; /* this page's page number */
- db_pgno_t prevpg; /* left sibling */
- db_pgno_t nextpg; /* right sibling */
-
-#define P_BINTERNAL 0x01 /* btree internal page */
-#define P_BLEAF 0x02 /* leaf page */
-#define P_OVERFLOW 0x04 /* overflow page */
-#define P_RINTERNAL 0x08 /* recno internal page */
-#define P_RLEAF 0x10 /* leaf page */
-#define P_TYPE 0x1f /* type mask */
-#define P_PRESERVE 0x20 /* never delete this chain of pages */
- u_int32_t flags;
-
- indx_t lower; /* lower bound of free space on page */
- indx_t upper; /* upper bound of free space on page */
- indx_t linp[1]; /* indx_t-aligned VAR. LENGTH DATA */
-} PAGE;
-
-/* First and next index. */
-#define BTDATAOFF \
- (sizeof(db_pgno_t) + sizeof(db_pgno_t) + sizeof(db_pgno_t) + \
- sizeof(u_int32_t) + sizeof(indx_t) + sizeof(indx_t))
-#define NEXTINDEX(p) (((p)->lower - BTDATAOFF) / sizeof(indx_t))
-
-/*
- * For pages other than overflow pages, there is an array of offsets into the
- * rest of the page immediately following the page header. Each offset is to
- * an item which is unique to the type of page. The h_lower offset is just
- * past the last filled-in index. The h_upper offset is the first item on the
- * page. Offsets are from the beginning of the page.
- *
- * If an item is too big to store on a single page, a flag is set and the item
- * is a { page, size } pair such that the page is the first page of an overflow
- * chain with size bytes of item. Overflow pages are simply bytes without any
- * external structure.
- *
- * The page number and size fields in the items are db_pgno_t-aligned so they can
- * be manipulated without copying. (This presumes that 32 bit items can be
- * manipulated on this system.)
- */
-#define LALIGN(n) (((n) + sizeof(db_pgno_t) - 1) & ~(sizeof(db_pgno_t) - 1))
-#define NOVFLSIZE (sizeof(db_pgno_t) + sizeof(u_int32_t))
-
-/*
- * For the btree internal pages, the item is a key. BINTERNALs are {key, pgno}
- * pairs, such that the key compares less than or equal to all of the records
- * on that page. For a tree without duplicate keys, an internal page with two
- * consecutive keys, a and b, will have all records greater than or equal to a
- * and less than b stored on the page associated with a. Duplicate keys are
- * somewhat special and can cause duplicate internal and leaf page records and
- * some minor modifications of the above rule.
- */
-typedef struct _binternal {
- u_int32_t ksize; /* key size */
- db_pgno_t pgno; /* page number stored on */
-#define P_BIGDATA 0x01 /* overflow data */
-#define P_BIGKEY 0x02 /* overflow key */
- u_char flags;
- char bytes[1]; /* data */
-} BINTERNAL;
-
-/* Get the page's BINTERNAL structure at index indx. */
-#define GETBINTERNAL(pg, indx) \
- ((BINTERNAL *)((char *)(pg) + (pg)->linp[indx]))
-
-/* Get the number of bytes in the entry. */
-#define NBINTERNAL(len) \
- LALIGN(sizeof(u_int32_t) + sizeof(db_pgno_t) + sizeof(u_char) + (len))
-
-/* Copy a BINTERNAL entry to the page. */
-#define WR_BINTERNAL(p, size, pgno, flags) { \
- *(u_int32_t *)p = size; \
- p += sizeof(u_int32_t); \
- *(db_pgno_t *)p = pgno; \
- p += sizeof(db_pgno_t); \
- *(u_char *)p = flags; \
- p += sizeof(u_char); \
-}
-
-/*
- * For the recno internal pages, the item is a page number with the number of
- * keys found on that page and below.
- */
-typedef struct _rinternal {
- recno_t nrecs; /* number of records */
- db_pgno_t pgno; /* page number stored below */
-} RINTERNAL;
-
-/* Get the page's RINTERNAL structure at index indx. */
-#define GETRINTERNAL(pg, indx) \
- ((RINTERNAL *)((char *)(pg) + (pg)->linp[indx]))
-
-/* Get the number of bytes in the entry. */
-#define NRINTERNAL \
- LALIGN(sizeof(recno_t) + sizeof(db_pgno_t))
-
-/* Copy a RINTERAL entry to the page. */
-#define WR_RINTERNAL(p, nrecs, pgno) { \
- *(recno_t *)p = nrecs; \
- p += sizeof(recno_t); \
- *(db_pgno_t *)p = pgno; \
-}
-
-/* For the btree leaf pages, the item is a key and data pair. */
-typedef struct _bleaf {
- u_int32_t ksize; /* size of key */
- u_int32_t dsize; /* size of data */
- u_char flags; /* P_BIGDATA, P_BIGKEY */
- char bytes[1]; /* data */
-} BLEAF;
-
-/* Get the page's BLEAF structure at index indx. */
-#define GETBLEAF(pg, indx) \
- ((BLEAF *)((char *)(pg) + (pg)->linp[indx]))
-
-/* Get the number of bytes in the entry. */
-#define NBLEAF(p) NBLEAFDBT((p)->ksize, (p)->dsize)
-
-/* Get the number of bytes in the user's key/data pair. */
-#define NBLEAFDBT(ksize, dsize) \
- LALIGN(sizeof(u_int32_t) + sizeof(u_int32_t) + sizeof(u_char) + \
- (ksize) + (dsize))
-
-/* Copy a BLEAF entry to the page. */
-#define WR_BLEAF(p, key, data, flags) { \
- *(u_int32_t *)p = key->size; \
- p += sizeof(u_int32_t); \
- *(u_int32_t *)p = data->size; \
- p += sizeof(u_int32_t); \
- *(u_char *)p = flags; \
- p += sizeof(u_char); \
- memmove(p, key->data, key->size); \
- p += key->size; \
- memmove(p, data->data, data->size); \
-}
-
-/* For the recno leaf pages, the item is a data entry. */
-typedef struct _rleaf {
- u_int32_t dsize; /* size of data */
- u_char flags; /* P_BIGDATA */
- char bytes[1];
-} RLEAF;
-
-/* Get the page's RLEAF structure at index indx. */
-#define GETRLEAF(pg, indx) \
- ((RLEAF *)((char *)(pg) + (pg)->linp[indx]))
-
-/* Get the number of bytes in the entry. */
-#define NRLEAF(p) NRLEAFDBT((p)->dsize)
-
-/* Get the number of bytes from the user's data. */
-#define NRLEAFDBT(dsize) \
- LALIGN(sizeof(u_int32_t) + sizeof(u_char) + (dsize))
-
-/* Copy a RLEAF entry to the page. */
-#define WR_RLEAF(p, data, flags) { \
- *(u_int32_t *)p = data->size; \
- p += sizeof(u_int32_t); \
- *(u_char *)p = flags; \
- p += sizeof(u_char); \
- memmove(p, data->data, data->size); \
-}
-
-/*
- * A record in the tree is either a pointer to a page and an index in the page
- * or a page number and an index. These structures are used as a cursor, stack
- * entry and search returns as well as to pass records to other routines.
- *
- * One comment about searches. Internal page searches must find the largest
- * record less than key in the tree so that descents work. Leaf page searches
- * must find the smallest record greater than key so that the returned index
- * is the record's correct position for insertion.
- */
-typedef struct _epgno {
- db_pgno_t pgno; /* the page number */
- indx_t index; /* the index on the page */
-} EPGNO;
-
-typedef struct _epg {
- PAGE *page; /* the (pinned) page */
- indx_t index; /* the index on the page */
-} EPG;
-
-/*
- * About cursors. The cursor (and the page that contained the key/data pair
- * that it referenced) can be deleted, which makes things a bit tricky. If
- * there are no duplicates of the cursor key in the tree (i.e. B_NODUPS is set
- * or there simply aren't any duplicates of the key) we copy the key that it
- * referenced when it's deleted, and reacquire a new cursor key if the cursor
- * is used again. If there are duplicates keys, we move to the next/previous
- * key, and set a flag so that we know what happened. NOTE: if duplicate (to
- * the cursor) keys are added to the tree during this process, it is undefined
- * if they will be returned or not in a cursor scan.
- *
- * The flags determine the possible states of the cursor:
- *
- * CURS_INIT The cursor references *something*.
- * CURS_ACQUIRE The cursor was deleted, and a key has been saved so that
- * we can reacquire the right position in the tree.
- * CURS_AFTER, CURS_BEFORE
- * The cursor was deleted, and now references a key/data pair
- * that has not yet been returned, either before or after the
- * deleted key/data pair.
- * XXX
- * This structure is broken out so that we can eventually offer multiple
- * cursors as part of the DB interface.
- */
-typedef struct _cursor {
- EPGNO pg; /* B: Saved tree reference. */
- DBT key; /* B: Saved key, or key.data == NULL. */
- recno_t rcursor; /* R: recno cursor (1-based) */
-
-#define CURS_ACQUIRE 0x01 /* B: Cursor needs to be reacquired. */
-#define CURS_AFTER 0x02 /* B: Unreturned cursor after key. */
-#define CURS_BEFORE 0x04 /* B: Unreturned cursor before key. */
-#define CURS_INIT 0x08 /* RB: Cursor initialized. */
- u_int8_t flags;
-} CURSOR;
-
-/*
- * The metadata of the tree. The nrecs field is used only by the RECNO code.
- * This is because the btree doesn't really need it and it requires that every
- * put or delete call modify the metadata.
- */
-typedef struct _btmeta {
- u_int32_t magic; /* magic number */
- u_int32_t version; /* version */
- u_int32_t psize; /* page size */
- u_int32_t free; /* page number of first free page */
- u_int32_t nrecs; /* R: number of records */
-
-#define SAVEMETA (B_NODUPS | R_RECNO)
- u_int32_t flags; /* bt_flags & SAVEMETA */
-} BTMETA;
-
-/* The in-memory btree/recno data structure. */
-typedef struct _btree {
- MPOOL *bt_mp; /* memory pool cookie */
-
- DB *bt_dbp; /* pointer to enclosing DB */
-
- EPG bt_cur; /* current (pinned) page */
- PAGE *bt_pinned; /* page pinned across calls */
-
- CURSOR bt_cursor; /* cursor */
-
-#define BT_PUSH(t, p, i) { \
- t->bt_sp->pgno = p; \
- t->bt_sp->index = i; \
- ++t->bt_sp; \
-}
-#define BT_POP(t) (t->bt_sp == t->bt_stack ? NULL : --t->bt_sp)
-#define BT_CLR(t) (t->bt_sp = t->bt_stack)
- EPGNO bt_stack[50]; /* stack of parent pages */
- EPGNO *bt_sp; /* current stack pointer */
-
- DBT bt_rkey; /* returned key */
- DBT bt_rdata; /* returned data */
-
- int bt_fd; /* tree file descriptor */
-
- db_pgno_t bt_free; /* next free page */
- u_int32_t bt_psize; /* page size */
- indx_t bt_ovflsize; /* cut-off for key/data overflow */
- int bt_lorder; /* byte order */
- /* sorted order */
- enum { NOT, BACK, FORWARD } bt_order;
- EPGNO bt_last; /* last insert */
-
- /* B: key comparison function */
- int (*bt_cmp) __P((const DBT *, const DBT *));
- /* B: prefix comparison function */
- size_t (*bt_pfx) __P((const DBT *, const DBT *));
- /* R: recno input function */
- int (*bt_irec) __P((struct _btree *, recno_t));
-
- FILE *bt_rfp; /* R: record FILE pointer */
- int bt_rfd; /* R: record file descriptor */
-
- caddr_t bt_cmap; /* R: current point in mapped space */
- caddr_t bt_smap; /* R: start of mapped space */
- caddr_t bt_emap; /* R: end of mapped space */
- size_t bt_msize; /* R: size of mapped region. */
-
- recno_t bt_nrecs; /* R: number of records */
- size_t bt_reclen; /* R: fixed record length */
- u_char bt_bval; /* R: delimiting byte/pad character */
-
-/*
- * NB:
- * B_NODUPS and R_RECNO are stored on disk, and may not be changed.
- */
-#define B_INMEM 0x00001 /* in-memory tree */
-#define B_METADIRTY 0x00002 /* need to write metadata */
-#define B_MODIFIED 0x00004 /* tree modified */
-#define B_NEEDSWAP 0x00008 /* if byte order requires swapping */
-#define B_RDONLY 0x00010 /* read-only tree */
-
-#define B_NODUPS 0x00020 /* no duplicate keys permitted */
-#define R_RECNO 0x00080 /* record oriented tree */
-
-#define R_CLOSEFP 0x00040 /* opened a file pointer */
-#define R_EOF 0x00100 /* end of input file reached. */
-#define R_FIXLEN 0x00200 /* fixed length records */
-#define R_MEMMAPPED 0x00400 /* memory mapped file. */
-#define R_INMEM 0x00800 /* in-memory file */
-#define R_MODIFIED 0x01000 /* modified file */
-#define R_RDONLY 0x02000 /* read-only file */
-
-#define B_DB_LOCK 0x04000 /* DB_LOCK specified. */
-#define B_DB_SHMEM 0x08000 /* DB_SHMEM specified. */
-#define B_DB_TXN 0x10000 /* DB_TXN specified. */
- u_int32_t flags;
-} BTREE;
-
-#include "extern.h"
diff --git a/src/util/db2/btree/extern.h b/src/util/db2/btree/extern.h
deleted file mode 100644
index 3aa88417e3..0000000000
--- a/src/util/db2/btree/extern.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.11 (Berkeley) 1/9/95
- */
-
-#define __bt_close __kdb2_bt_close
-#define __bt_cmp __kdb2_bt_cmp
-#define __bt_crsrdel __kdb2_bt_crsrdel
-#define __bt_defcmp __kdb2_bt_defcmp
-#define __bt_defpfx __kdb2_bt_defpfx
-#define __bt_delete __kdb2_bt_delete
-#define __bt_dleaf __kdb2_bt_deleaf
-#define __bt_fd __kdb2_bt_fd
-#define __bt_free __kdb2_bt_free
-#define __bt_get __kdb2_bt_get
-#define __bt_new __kdb2_bt_new
-#define __bt_pgin __kdb2_bt_pgin
-#define __bt_pgout __kdb2_bt_pgout
-#define __bt_push __kdb2_bt_push
-#define __bt_put __kdb2_bt_put
-#define __bt_ret __kdb2_bt_ret
-#define __bt_search __kdb2_bt_search
-#define __bt_seq __kdb2_bt_seq
-#define __bt_setcur __kdb2_bt_setcur
-#define __bt_split __kdb2_bt_split
-#define __bt_sync __kdb2_bt_sync
-#define __ovfl_delete __kdb2_ovfl_delete
-#define __ovfl_get __kdb2_ovfl_get
-#define __ovfl_put __kdb2_ovfl_put
-#define __bt_dnpage __kdb2_bt_dnpage
-#define __bt_dmpage __kdb2_bt_dmpage
-#define __bt_dpage __kdb2_bt_dpage
-#define __bt_dump __kdb2_bt_dump
-#define __bt_stat __kdb2_bt_stat
-
-#define bt_rcinit kdb2_bt_rcinit
-#define bt_rcdestroy kdb2_bt_rcdestroy
-#define bt_rcpush kdb2_bt_rcpush
-#define bt_rcpop kdb2_bt_rcpop
-#define bt_rcclr kdb2_bt_rcclr
-#define bt_rcgrowstk kdb2_bt_rcgrowstk
-#define bt_rseqset kdb2_bt_rseqset
-#define bt_rseqadv kdb2_bt_rseqadv
-
-int __bt_close __P((DB *));
-int __bt_cmp __P((BTREE *, const DBT *, EPG *));
-int __bt_crsrdel __P((BTREE *, EPGNO *));
-int __bt_defcmp __P((const DBT *, const DBT *));
-size_t __bt_defpfx __P((const DBT *, const DBT *));
-int __bt_delete __P((const DB *, const DBT *, u_int));
-int __bt_dleaf __P((BTREE *, const DBT *, PAGE *, u_int));
-int __bt_fd __P((const DB *));
-int __bt_free __P((BTREE *, PAGE *));
-int __bt_get __P((const DB *, const DBT *, DBT *, u_int));
-PAGE *__bt_new __P((BTREE *, db_pgno_t *));
-void __bt_pgin __P((void *, db_pgno_t, void *));
-void __bt_pgout __P((void *, db_pgno_t, void *));
-int __bt_push __P((BTREE *, db_pgno_t, int));
-int __bt_put __P((const DB *dbp, DBT *, const DBT *, u_int));
-int __bt_ret __P((BTREE *, EPG *, DBT *, DBT *, DBT *, DBT *, int));
-EPG *__bt_search __P((BTREE *, const DBT *, int *));
-int __bt_seq __P((const DB *, DBT *, DBT *, u_int));
-void __bt_setcur __P((BTREE *, db_pgno_t, u_int));
-int __bt_split __P((BTREE *, PAGE *,
- const DBT *, const DBT *, int, size_t, u_int32_t));
-int __bt_sync __P((const DB *, u_int));
-
-int __ovfl_delete __P((BTREE *, void *));
-int __ovfl_get __P((BTREE *, void *, size_t *, void **, size_t *));
-int __ovfl_put __P((BTREE *, const DBT *, db_pgno_t *));
-
-#ifdef DEBUG
-int __bt_dnpage __P((DB *, db_pgno_t));
-int __bt_dpage __P((DB *, PAGE *));
-int __bt_dmpage __P((PAGE *));
-int __bt_dump __P((DB *));
-#endif
-#ifdef STATISTICS
-int __bt_stat __P((DB *));
-#endif
diff --git a/src/util/db2/clib/Makefile.in b/src/util/db2/clib/Makefile.in
deleted file mode 100644
index 3f3d2b8be4..0000000000
--- a/src/util/db2/clib/Makefile.in
+++ /dev/null
@@ -1,11 +0,0 @@
-thisconfigdir=./..
-myfulldir=util/db2/clib
-mydir=clib
-BUILDTOP=$(REL)..$(S)..$(S)..
-STLIBOBJS=@MEMMOVE_OBJ@ @MKSTEMP_OBJ@ @STRERROR_OBJ@
-
-LOCALINCLUDES=-I../include
-
-all-unix:: all-libobjs
-clean-unix:: clean-libobjs
-# @libobj_frag@
diff --git a/src/util/db2/clib/memmove.c b/src/util/db2/clib/memmove.c
deleted file mode 100644
index f9bf650a38..0000000000
--- a/src/util/db2/clib/memmove.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Chris Torek.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)bcopy.c 8.1 (Berkeley) 6/4/93";
-#endif /* LIBC_SCCS and not lint */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <string.h>
-
-/*
- * sizeof(word) MUST BE A POWER OF TWO
- * SO THAT wmask BELOW IS ALL ONES
- */
-typedef int word; /* "word" used for optimal copy speed */
-
-#define wsize sizeof(word)
-#define wmask (wsize - 1)
-
-/*
- * Copy a block of memory, handling overlap.
- * This is the routine that actually implements
- * (the portable versions of) bcopy, memcpy, and memmove.
- */
-#ifdef MEMCOPY
-void *
-memcpy(dst0, src0, length)
-#else
-#ifdef MEMMOVE
-void *
-memmove(dst0, src0, length)
-#else
-void
-bcopy(src0, dst0, length)
-#endif
-#endif
- void *dst0;
- const void *src0;
- register size_t length;
-{
- register char *dst = dst0;
- register const char *src = src0;
- register size_t t;
-
- if (length == 0 || dst == src) /* nothing to do */
- goto done;
-
- /*
- * Macros: loop-t-times; and loop-t-times, t>0
- */
-#define TLOOP(s) if (t) TLOOP1(s)
-#define TLOOP1(s) do { s; } while (--t)
-
- if ((unsigned long)dst < (unsigned long)src) {
- /*
- * Copy forward.
- */
- t = (int)src; /* only need low bits */
- if ((t | (int)dst) & wmask) {
- /*
- * Try to align operands. This cannot be done
- * unless the low bits match.
- */
- if ((t ^ (int)dst) & wmask || length < wsize)
- t = length;
- else
- t = wsize - (t & wmask);
- length -= t;
- TLOOP1(*dst++ = *src++);
- }
- /*
- * Copy whole words, then mop up any trailing bytes.
- */
- t = length / wsize;
- TLOOP(*(word *)dst = *(word *)src; src += wsize; dst += wsize);
- t = length & wmask;
- TLOOP(*dst++ = *src++);
- } else {
- /*
- * Copy backwards. Otherwise essentially the same.
- * Alignment works as before, except that it takes
- * (t&wmask) bytes to align, not wsize-(t&wmask).
- */
- src += length;
- dst += length;
- t = (int)src;
- if ((t | (int)dst) & wmask) {
- if ((t ^ (int)dst) & wmask || length <= wsize)
- t = length;
- else
- t &= wmask;
- length -= t;
- TLOOP1(*--dst = *--src);
- }
- t = length / wsize;
- TLOOP(src -= wsize; dst -= wsize; *(word *)dst = *(word *)src);
- t = length & wmask;
- TLOOP(*--dst = *--src);
- }
-done:
-#if defined(MEMCOPY) || defined(MEMMOVE)
- return (dst0);
-#else
- return;
-#endif
-}
diff --git a/src/util/db2/clib/mkstemp.c b/src/util/db2/clib/mkstemp.c
deleted file mode 100644
index 71dc7d17a1..0000000000
--- a/src/util/db2/clib/mkstemp.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (c) 1987, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)mktemp.c 8.1 (Berkeley) 6/4/93";
-#endif /* LIBC_SCCS and not lint */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <stdio.h>
-#include <ctype.h>
-
-#ifndef O_BINARY
-#define O_BINARY 0
-#endif
-
-static int _gettemp();
-
-mkstemp(path)
- char *path;
-{
- int fd;
-
- return (_gettemp(path, &fd) ? fd : -1);
-}
-
-static
-_gettemp(path, doopen)
- char *path;
- register int *doopen;
-{
- register char *start, *trv;
- struct stat sbuf;
- u_int pid;
-
- pid = getpid();
- for (trv = path; *trv; ++trv); /* extra X's get set to 0's */
- while (*--trv == 'X') {
- *trv = (pid % 10) + '0';
- pid /= 10;
- }
-
- /*
- * check the target directory; if you have six X's and it
- * doesn't exist this runs for a *very* long time.
- */
- for (start = trv + 1;; --trv) {
- if (trv <= path)
- break;
- if (*trv == '/') {
- *trv = '\0';
- if (stat(path, &sbuf))
- return(0);
- if (!S_ISDIR(sbuf.st_mode)) {
- errno = ENOTDIR;
- return(0);
- }
- *trv = '/';
- break;
- }
- }
-
- for (;;) {
- if (doopen) {
- if ((*doopen =
- open(path, O_CREAT|O_EXCL|O_RDWR|O_BINARY, 0600)) >= 0)
- return(1);
- if (errno != EEXIST)
- return(0);
- }
- else if (stat(path, &sbuf))
- return(errno == ENOENT ? 1 : 0);
-
- /* tricky little algorithm for backward compatibility */
- for (trv = start;;) {
- if (!*trv)
- return(0);
- if (*trv == 'z')
- *trv++ = 'a';
- else {
- if (isdigit(*trv))
- *trv = 'a';
- else
- ++*trv;
- break;
- }
- }
- }
- /*NOTREACHED*/
-}
diff --git a/src/util/db2/clib/strerror.c b/src/util/db2/clib/strerror.c
deleted file mode 100644
index 0a509f79f2..0000000000
--- a/src/util/db2/clib/strerror.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)strerror.c 8.1 (Berkeley) 6/4/93";
-#endif /* LIBC_SCCS and not lint */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <string.h>
-
-char *
-strerror(num)
- int num;
-{
- extern int sys_nerr;
- extern char *sys_errlist[];
-#define UPREFIX "Unknown error: "
- static char ebuf[40] = UPREFIX; /* 64-bit number + slop */
- register unsigned int errnum;
- register char *p, *t;
- char tmp[40];
-
- errnum = num; /* convert to unsigned */
- if (errnum < sys_nerr)
- return(sys_errlist[errnum]);
-
- /* Do this by hand, so we don't include stdio(3). */
- t = tmp;
- do {
- *t++ = "0123456789"[errnum % 10];
- } while (errnum /= 10);
- for (p = ebuf + sizeof(UPREFIX) - 1;;) {
- *p++ = *--t;
- if (t <= tmp)
- break;
- }
- return(ebuf);
-}
diff --git a/src/util/db2/configure.in b/src/util/db2/configure.in
deleted file mode 100644
index dadaa48df0..0000000000
--- a/src/util/db2/configure.in
+++ /dev/null
@@ -1,96 +0,0 @@
-dnl Process this file with autoconf to produce a configure script.
-K5_AC_INIT(db/db.c)
-AC_CONFIG_HEADER(include/config.h include/db-config.h)
-CONFIG_RULES
-
-AC_PATH_PROG(FALSE,false,:)
-AC_PATH_PROG(SH,sh,$FALSE)
-AC_PATH_PROG(SH5,sh5,$FALSE)
-AC_PATH_PROG(BASH,bash,$FALSE)
-
-AC_CACHE_CHECK([checking for shell with functions],local_cv_program_fctsh,
-[if $SH -c 'foo() { true; }; foo' > /dev/null 2>&1; then
- local_cv_program_fctsh=$SH
-else
- if $SH5 -c 'foo() { true; }; foo' > /dev/null 2>&1; then
- local_cv_program_fctsh=$SH5
- else
- if $BASH -c 'foo() { true; }; foo' > /dev/null 2>&1; then
- local_cv_program_fctsh=$BASH
- else
- local_cv_program_fctsh=$FALSE
- fi
- fi
-fi])
-
-FCTSH=$local_cv_program_fctsh
-AC_SUBST(FCTSH)
-
-dnl checks for libraries
-dnl checks for header files
-AC_CHECK_HEADERS(unistd.h stdint.h inttypes.h)
-dnl checks for typedefs
-AC_TYPE_SIZE_T
-
-dnl AC_COMPILE_TYPE(TYPE, DEFAULT)
-AC_DEFUN(AC_COMPILE_TYPE,
-[AC_REQUIRE([AC_HEADER_STDC])dnl
-AC_MSG_CHECKING(for $1)
-AC_CACHE_VAL(ac_cv_type_$1,
-[AC_TRY_COMPILE([#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#endif], [$1 test_variable;], ac_cv_type_$1=yes, ac_cv_type_$1=no)])dnl
-AC_MSG_RESULT($ac_cv_type_$1)
-if test $ac_cv_type_$1 = no; then
- AC_DEFINE($1, $2, [Define to \`$2' if not defined on system])
-fi
-])
-
-
-AC_CHECK_TYPE(ssize_t, int)
-
-AC_CHECK_TYPE(u_char, unsigned char)
-AC_CHECK_TYPE(u_int, unsigned int)
-AC_CHECK_TYPE(u_long, unsigned long)
-
-AC_CHECK_TYPE(int8_t, signed char)
-AC_CHECK_TYPE(u_int8_t, unsigned char)
-AC_CHECK_TYPE(int16_t, short)
-AC_CHECK_TYPE(u_int16_t, unsigned short)
-AC_COMPILE_TYPE(int32_t, int)
-AC_COMPILE_TYPE(u_int32_t, unsigned int)
-
-dnl checks for structures
-dnl checks for compiler characteristics
-dnl AC_C_BIGENDIAN - No, check at compile time; Darwin can build for multiple
-dnl targets in one tree.
-AC_CHECK_HEADERS(endian.h machine/endian.h sys/param.h)
-dnl sys/param.h for AIX 4.3.3 (actually sys/machine.h)
-dnl There's also sys/endian.h on IRIX, but we already check _MIPSE{L,B}.
-AC_C_CONST
-AC_CHECK_SIZEOF(int)
-
-dnl checks for library functions
-AC_CHECK_FUNC(memmove, ,
-[MEMMOVE_OBJ=memmove.o
-AC_DEFINE(memmove, kdb2__memmove,[Define to kdb2__memmove to provide private memmove function])
-AC_DEFINE(MEMMOVE,1,[Define if memmove.o is compiled in])])
-AC_SUBST(MEMMOVE_OBJ)
-
-AC_CHECK_FUNC(mkstemp, ,
-[MKSTEMP_OBJ=mkstemp.o
-AC_DEFINE(mkstemp, kdb2__mkstemp,[Define to \`kdb2__mkstemp' to provide private mkstemp function])])
-AC_SUBST(MKSTEMP_OBJ)
-
-AC_CHECK_FUNC(strerror, ,
-[STRERROR_OBJ=strerror.o
-AC_DEFINE(strerror, kdb2__strerror,[Define to \`kdb2__strerror' to provide private strerror function])])
-AC_SUBST(STRERROR_OBJ)
-
-KRB5_BUILD_LIBRARY
-KRB5_BUILD_LIBOBJS
-KRB5_BUILD_PROGRAM
-KRB5_RUN_FLAGS
-AC_CONFIG_FILES(include/generated.stmp:Makefile.in)
-V5_AC_OUTPUT_MAKEFILE(. hash btree db mpool recno clib test)
diff --git a/src/util/db2/db/Makefile.in b/src/util/db2/db/Makefile.in
deleted file mode 100644
index b173b0d79e..0000000000
--- a/src/util/db2/db/Makefile.in
+++ /dev/null
@@ -1,11 +0,0 @@
-thisconfigdir=./..
-myfulldir=util/db2/db
-mydir=db
-BUILDTOP=$(REL)..$(S)..$(S)..
-STLIBOBJS=db.o
-
-LOCALINCLUDES= -I. -I$(srcdir)/../include -I../include -I$(srcdir)/../mpool
-
-all-unix:: all-libobjs
-clean-unix:: clean-libobjs
-# @libobj_frag@
diff --git a/src/util/db2/db/Makefile.inc b/src/util/db2/db/Makefile.inc
deleted file mode 100644
index 59478ba198..0000000000
--- a/src/util/db2/db/Makefile.inc
+++ /dev/null
@@ -1,5 +0,0 @@
-# @(#)Makefile.inc 8.1 (Berkeley) 6/4/93
-
-.PATH: ${.CURDIR}/db/db
-
-SRCS+= db.c
diff --git a/src/util/db2/db/db.c b/src/util/db2/db/db.c
deleted file mode 100644
index fba7795342..0000000000
--- a/src/util/db2/db/db.c
+++ /dev/null
@@ -1,99 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)db.c 8.4 (Berkeley) 2/21/94";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stddef.h>
-#include <stdio.h>
-
-#include "db-int.h"
-
-DB *
-kdb2_dbopen(fname, flags, mode, type, openinfo)
- const char *fname;
- int flags, mode;
- DBTYPE type;
- const void *openinfo;
-{
-
-#define DB_FLAGS (DB_LOCK | DB_SHMEM | DB_TXN)
-#define USE_OPEN_FLAGS \
- (O_CREAT | O_EXCL | O_EXLOCK | O_NONBLOCK | O_RDONLY | \
- O_RDWR | O_SHLOCK | O_TRUNC | O_BINARY)
-
- if ((flags & ~(USE_OPEN_FLAGS | DB_FLAGS)) == 0)
- switch (type) {
- case DB_BTREE:
- return (__bt_open(fname, flags & USE_OPEN_FLAGS,
- mode, openinfo, flags & DB_FLAGS));
- case DB_HASH:
- return (__hash_open(fname, flags & USE_OPEN_FLAGS,
- mode, openinfo, flags & DB_FLAGS));
- case DB_RECNO:
- return (__rec_open(fname, flags & USE_OPEN_FLAGS,
- mode, openinfo, flags & DB_FLAGS));
- }
- errno = EINVAL;
- return (NULL);
-}
-
-static int
-__dberr()
-{
- return (RET_ERROR);
-}
-
-/*
- * __DBPANIC -- Stop.
- *
- * Parameters:
- * dbp: pointer to the DB structure.
- */
-void
-__dbpanic(dbp)
- DB *dbp;
-{
- /* The only thing that can succeed is a close. */
- dbp->del = (int (*)())__dberr;
- dbp->fd = (int (*)())__dberr;
- dbp->get = (int (*)())__dberr;
- dbp->put = (int (*)())__dberr;
- dbp->seq = (int (*)())__dberr;
- dbp->sync = (int (*)())__dberr;
-}
diff --git a/src/util/db2/docs/btree.3.ps b/src/util/db2/docs/btree.3.ps
deleted file mode 100644
index c79c97232c..0000000000
--- a/src/util/db2/docs/btree.3.ps
+++ /dev/null
@@ -1,366 +0,0 @@
-%!PS-Adobe-3.0
-%%Creator: groff version 1.08
-%%DocumentNeededResources: font Times-Roman
-%%+ font Times-Bold
-%%+ font Times-Italic
-%%DocumentSuppliedResources: procset grops 1.08 0
-%%Pages: 2
-%%PageOrder: Ascend
-%%Orientation: Portrait
-%%EndComments
-%%BeginProlog
-%%BeginResource: procset grops 1.08 0
-/setpacking where{
-pop
-currentpacking
-true setpacking
-}if
-/grops 120 dict dup begin
-/SC 32 def
-/A/show load def
-/B{0 SC 3 -1 roll widthshow}bind def
-/C{0 exch ashow}bind def
-/D{0 exch 0 SC 5 2 roll awidthshow}bind def
-/E{0 rmoveto show}bind def
-/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
-/G{0 rmoveto 0 exch ashow}bind def
-/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/I{0 exch rmoveto show}bind def
-/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
-/K{0 exch rmoveto 0 exch ashow}bind def
-/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/M{rmoveto show}bind def
-/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
-/O{rmoveto 0 exch ashow}bind def
-/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/Q{moveto show}bind def
-/R{moveto 0 SC 3 -1 roll widthshow}bind def
-/S{moveto 0 exch ashow}bind def
-/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/SF{
-findfont exch
-[exch dup 0 exch 0 exch neg 0 0]makefont
-dup setfont
-[exch/setfont cvx]cvx bind def
-}bind def
-/MF{
-findfont
-[5 2 roll
-0 3 1 roll
-neg 0 0]makefont
-dup setfont
-[exch/setfont cvx]cvx bind def
-}bind def
-/level0 0 def
-/RES 0 def
-/PL 0 def
-/LS 0 def
-/PLG{
-gsave newpath clippath pathbbox grestore
-exch pop add exch pop
-}bind def
-/BP{
-/level0 save def
-1 setlinecap
-1 setlinejoin
-72 RES div dup scale
-LS{
-90 rotate
-}{
-0 PL translate
-}ifelse
-1 -1 scale
-}bind def
-/EP{
-level0 restore
-showpage
-}bind def
-/DA{
-newpath arcn stroke
-}bind def
-/SN{
-transform
-.25 sub exch .25 sub exch
-round .25 add exch round .25 add exch
-itransform
-}bind def
-/DL{
-SN
-moveto
-SN
-lineto stroke
-}bind def
-/DC{
-newpath 0 360 arc closepath
-}bind def
-/TM matrix def
-/DE{
-TM currentmatrix pop
-translate scale newpath 0 0 .5 0 360 arc closepath
-TM setmatrix
-}bind def
-/RC/rcurveto load def
-/RL/rlineto load def
-/ST/stroke load def
-/MT/moveto load def
-/CL/closepath load def
-/FL{
-currentgray exch setgray fill setgray
-}bind def
-/BL/fill load def
-/LW/setlinewidth load def
-/RE{
-findfont
-dup maxlength 1 index/FontName known not{1 add}if dict begin
-{
-1 index/FID ne{def}{pop pop}ifelse
-}forall
-/Encoding exch def
-dup/FontName exch def
-currentdict end definefont pop
-}bind def
-/DEFS 0 def
-/EBEGIN{
-moveto
-DEFS begin
-}bind def
-/EEND/end load def
-/CNT 0 def
-/level1 0 def
-/PBEGIN{
-/level1 save def
-translate
-div 3 1 roll div exch scale
-neg exch neg exch translate
-0 setgray
-0 setlinecap
-1 setlinewidth
-0 setlinejoin
-10 setmiterlimit
-[]0 setdash
-/setstrokeadjust where{
-pop
-false setstrokeadjust
-}if
-/setoverprint where{
-pop
-false setoverprint
-}if
-newpath
-/CNT countdictstack def
-userdict begin
-/showpage{}def
-}bind def
-/PEND{
-clear
-countdictstack CNT sub{end}repeat
-level1 restore
-}bind def
-end def
-/setpacking where{
-pop
-setpacking
-}if
-%%EndResource
-%%IncludeResource: font Times-Roman
-%%IncludeResource: font Times-Bold
-%%IncludeResource: font Times-Italic
-grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL
-792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron/scaron/zcaron
-/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space
-/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft
-/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four
-/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C
-/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash
-/bracketright/circumflex/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q
-/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase
-/guillemotleft/guillemotright/bullet/florin/fraction/perthousand/dagger
-/daggerdbl/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
-/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
-/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar
-/section/dieresis/copyright/ordfeminine/guilsinglleft/logicalnot/minus
-/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu
-/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guilsinglright
-/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde
-/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute
-/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
-/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls
-/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute
-/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve
-/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex
-/udieresis/yacute/thorn/ydieresis]def/Times-Italic@0 ENC0/Times-Italic RE
-/Times-Bold@0 ENC0/Times-Bold RE/Times-Roman@0 ENC0/Times-Roman RE
-%%EndProlog
-%%Page: 1 1
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 132.34(BTREE\(3\) BSD)72 48 R(Programmer')2.5 E 2.5(sM)
--.55 G 132.34(anual BTREE\(3\))340.17 48 R/F1 9/Times-Bold@0 SF -.18(NA)72 84 S
-(ME).18 E F0(btree \255 btree database access method)108 96 Q F1(SYNOPSIS)72
-112.8 Q/F2 10/Times-Bold@0 SF(#include <sys/types.h>)108 124.8 Q(#include <db)
-108 136.8 Q(.h>)-.4 E F1(DESCRIPTION)72 153.6 Q F0 .198(The routine)108 165.6 R
-/F3 10/Times-Italic@0 SF(dbopen)2.698 E F0 .198(is the library interf)2.698 F
-.198(ace to database \214les.)-.1 F .198
-(One of the supported \214le formats is btree \214les.)5.198 F .974
-(The general description of the database access methods is in)108 177.6 R F3
-(dbopen)3.475 E F0 .975(\(3\), this manual page describes only).24 F
-(the btree speci\214c information.)108 189.6 Q(The btree data structure is a s\
-orted, balanced tree structure storing associated k)108 206.4 Q -.15(ey)-.1 G
-(/data pairs.).15 E .504(The btree access method speci\214c data structure pro)
-108 223.2 R .504(vided to)-.15 F F3(dbopen)3.004 E F0 .503
-(is de\214ned in the <db)3.003 F .503(.h> include \214le as)-.4 F(follo)108
-235.2 Q(ws:)-.25 E(typedef struct {)108 252 Q(u_long \215ags;)144 264 Q
-(u_int cachesize;)144 276 Q(inde)144 288 Q(x_t psize;)-.15 E(int lorder;)144
-300 Q(int mink)144 312 Q -.15(ey)-.1 G(page;).15 E
-(int \(*compare\)\(const DBT *k)144 324 Q -.15(ey)-.1 G(1, const DBT *k).15 E
--.15(ey)-.1 G(2\);).15 E(int \(*pre\214x\)\(const DBT *k)144 336 Q -.15(ey)-.1
-G(1, const DBT *k).15 E -.15(ey)-.1 G(2\);).15 E 2.5(}B)108 348 S(TREEINFO;)
-121.97 348 Q(The elements of this structure are as follo)108 364.8 Q(ws:)-.25 E
-14.61(\215ags The)108 381.6 R(\215ag v)2.5 E(alue is speci\214ed by)-.25 E F3
-(or)2.5 E F0('ing an).73 E 2.5(yo)-.15 G 2.5(ft)313.2 381.6 S(he follo)321.81
-381.6 Q(wing v)-.25 E(alues:)-.25 E(R_DUP)144 398.4 Q 1.296(Permit duplicate k)
-180 410.4 R -.15(ey)-.1 G 3.796(si).15 G 3.796(nt)275.578 410.4 S 1.296
-(he tree, i.e. permit insertion if the k)287.154 410.4 R 1.596 -.15(ey t)-.1 H
-3.796(ob).15 G 3.796(ei)466.878 410.4 S 1.296(nserted already)477.894 410.4 R
--.15(ex)180 422.4 S 1.935(ists in the tree.).15 F 1.935(The def)6.935 F 1.935
-(ault beha)-.1 F(vior)-.2 E 4.435(,a)-.4 G 4.435(sd)358.215 422.4 S 1.935
-(escribed in)371.54 422.4 R F3(dbopen)4.435 E F0 1.935(\(3\), is to o).24 F
--.15(ve)-.15 G 1.935(rwrite a).15 F .148(matching k)180 434.4 R .448 -.15(ey w)
--.1 H .148(hen inserting a ne).15 F 2.649(wk)-.25 G .449 -.15(ey o)329.709
-434.4 T 2.649(rt).15 G 2.649(of)355.407 434.4 S .149(ail if the R_NOO)366.286
-434.4 R(VER)-.5 E .149(WRITE \215ag is speci-)-.55 F 5.972(\214ed. The)180
-446.4 R 3.472(R_DUP \215ag is o)5.972 F -.15(ve)-.15 G 3.472
-(rridden by the R_NOO).15 F(VER)-.5 E 3.471(WRITE \215ag, and if the)-.55 F
-(R_NOO)180 458.4 Q(VER)-.5 E .781
-(WRITE \215ag is speci\214ed, attempts to insert duplicate k)-.55 F -.15(ey)-.1
-G 3.282(si).15 G .782(nto the tree will)474.604 458.4 R -.1(fa)180 470.4 S(il.)
-.1 E 1.13(If the database contains duplicate k)180 487.2 R -.15(ey)-.1 G 1.129
-(s, the order of retrie).15 F -.25(va)-.25 G 3.629(lo).25 G 3.629(fk)439.644
-487.2 S -.15(ey)451.503 487.2 S 1.129(/data pairs is unde-).15 F .837
-(\214ned if the)180 499.2 R F3 -.1(ge)3.337 G(t).1 E F0 .837
-(routine is used, ho)3.337 F(we)-.25 E -.15(ve)-.25 G -.4(r,).15 G F3(seq)3.737
-E F0 .838(routine calls with the R_CURSOR \215ag set)3.337 F(will al)180 511.2
-Q -.1(wa)-.1 G(ys return the logical `).1 E(`\214rst')-.74 E 2.5('o)-.74 G 2.5
-(fa)333.85 511.2 S .3 -.15(ny g)344.12 511.2 T(roup of duplicate k).15 E -.15
-(ey)-.1 G(s.).15 E(cachesize)108 528 Q 3.056(As)144 540 S .556
-(uggested maximum size \(in bytes\) of the memory cache.)158.166 540 R .555
-(This v)5.556 F .555(alue is)-.25 F F2(only)3.055 E F0(advisory)3.055 E 3.055
-(,a)-.65 G .555(nd the)514.725 540 R .759
-(access method will allocate more memory rather than f)144 552 R 3.259
-(ail. Since)-.1 F -2.15 -.25(ev e)3.259 H .76(ry search e).25 F .76
-(xamines the root)-.15 F .055
-(page of the tree, caching the most recently used pages substantially impro)144
-564 R -.15(ve)-.15 G 2.554(sa).15 G .054(ccess time.)459.578 564 R .054
-(In addi-)5.054 F .661(tion, ph)144 576 R .662(ysical writes are delayed as lo\
-ng as possible, so a moderate cache can reduce the number)-.05 F .601
-(of I/O operations signi\214cantly)144 588 R 5.601(.O)-.65 G -.15(bv)280.744
-588 S(iously).15 E 3.101(,u)-.65 G .601(sing a cache increases \(b)324.995 588
-R .6(ut only increases\) the lik)-.2 F(eli-)-.1 E .19(hood of corruption or lo\
-st data if the system crashes while a tree is being modi\214ed.)144 600 R(If)
-5.191 E F3(cac)2.691 E(hesize)-.15 E F0(is)2.691 E 2.5(0\()144 612 S
-(no size is speci\214ed\) a def)154.83 612 Q(ault cache is used.)-.1 E 12.95
-(psize P)108 628.8 R .45
-(age size is the size \(in bytes\) of the pages used for nodes in the tree.)
--.15 F .449(The minimum page size is)5.449 F .442
-(512 bytes and the maximum page size is 64K.)144 640.8 R(If)5.442 E F3(psize)
-2.942 E F0 .442(is 0 \(no page size is speci\214ed\) a page size)2.942 F
-(is chosen based on the underlying \214le system I/O block size.)144 652.8 Q
-9.62(lorder The)108 669.6 R 1.597(byte order for inte)4.097 F 1.596
-(gers in the stored database metadata.)-.15 F 1.596
-(The number should represent the)6.596 F .688(order as an inte)144 681.6 R .689
-(ger; for e)-.15 F .689(xample, big endian order w)-.15 F .689
-(ould be the number 4,321.)-.1 F(If)5.689 E F3(lor)3.189 E(der)-.37 E F0 .689
-(is 0 \(no)3.189 F(order is speci\214ed\) the current host order is used.)144
-693.6 Q 174.135(4.4BSD June)72 732 R(4, 1993)2.5 E(1)535 732 Q EP
-%%Page: 2 2
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 132.34(BTREE\(3\) BSD)72 48 R(Programmer')2.5 E 2.5(sM)
--.55 G 132.34(anual BTREE\(3\))340.17 48 R(mink)108 84 Q -.15(ey)-.1 G(page).15
-E 1.423(The minimum number of k)144 96 R -.15(ey)-.1 G 3.923(sw).15 G 1.422
-(hich will be stored on an)282.245 96 R 3.922(ys)-.15 G 1.422(ingle page.)
-400.618 96 R 1.422(This v)6.422 F 1.422(alue is used to)-.25 F .257
-(determine which k)144 108 R -.15(ey)-.1 G 2.757(sw).15 G .257
-(ill be stored on o)242.001 108 R -.15(ve)-.15 G(r\215o).15 E 2.757(wp)-.25 G
-.257(ages, i.e. if a k)348.006 108 R .558 -.15(ey o)-.1 H 2.758(rd).15 G .258
-(ata item is longer than the)435.11 108 R 1.102(pagesize di)144 120 R 1.102
-(vided by the mink)-.25 F -.15(ey)-.1 G 1.102(page v).15 F 1.102
-(alue, it will be stored on o)-.25 F -.15(ve)-.15 G(r\215o).15 E 3.602(wp)-.25
-G 1.102(ages instead of in the)451.164 120 R(page itself.)144 132 Q(If)5 E/F1
-10/Times-Italic@0 SF(mink)2.5 E -.3(ey)-.1 G(pa).3 E -.1(ge)-.1 G F0
-(is 0 \(no minimum number of k)2.6 E -.15(ey)-.1 G 2.5(si).15 G 2.5(ss)392.84
-132 S(peci\214ed\) a v)403.12 132 Q(alue of 2 is used.)-.25 E(compare)108 148.8
-Q .751(Compare is the k)144 160.8 R 1.051 -.15(ey c)-.1 H .751
-(omparison function.).15 F .751(It must return an inte)5.751 F .752
-(ger less than, equal to, or greater)-.15 F .913(than zero if the \214rst k)144
-172.8 R 1.213 -.15(ey a)-.1 H -.18(rg).15 G .913
-(ument is considered to be respecti).18 F -.15(ve)-.25 G .913
-(ly less than, equal to, or greater).15 F .352(than the second k)144 184.8 R
-.652 -.15(ey a)-.1 H -.18(rg).15 G 2.852(ument. The).18 F .353
-(same comparison function must be used on a gi)2.852 F -.15(ve)-.25 G 2.853(nt)
-.15 G .353(ree e)503.127 184.8 R -.15(ve)-.25 G(ry).15 E .817
-(time it is opened.)144 196.8 R(If)5.817 E F1(compar)3.317 E(e)-.37 E F0 .817
-(is NULL \(no comparison function is speci\214ed\), the k)3.317 F -.15(ey)-.1 G
-3.316(sa).15 G .816(re com-)508.364 196.8 R(pared le)144 208.8 Q(xically)-.15 E
-2.5(,w)-.65 G(ith shorter k)214.57 208.8 Q -.15(ey)-.1 G 2.5(sc).15 G
-(onsidered less than longer k)282.92 208.8 Q -.15(ey)-.1 G(s.).15 E 10.17
-(pre\214x Pre\214x)108 225.6 R .291(is the pre\214x comparison function.)2.791
-F .292(If speci\214ed, this routine must return the number of bytes)5.291 F
-.937(of the second k)144 237.6 R 1.237 -.15(ey a)-.1 H -.18(rg).15 G .937
-(ument which are necessary to determine that it is greater than the \214rst k)
-.18 F -.15(ey)-.1 G(ar)144 249.6 Q 3.477(gument. If)-.18 F .977(the k)3.477 F
--.15(ey)-.1 G 3.477(sa).15 G .977(re equal, the k)241.898 249.6 R 1.277 -.15
-(ey l)-.1 H .978(ength should be returned.).15 F .978
-(Note, the usefulness of this)5.978 F .558(routine is v)144 261.6 R .558
-(ery data dependent, b)-.15 F .558
-(ut, in some data sets can produce signi\214cantly reduced tree sizes)-.2 F
-.354(and search times.)144 273.6 R(If)5.354 E F1(pr)2.854 E(e\214x)-.37 E F0
-.354(is NULL \(no pre\214x function is speci\214ed\),)2.854 F/F2 10
-/Times-Bold@0 SF(and)2.854 E F0 .354(no comparison function)2.854 F .193
-(is speci\214ed, a def)144 285.6 R .193(ault le)-.1 F .193
-(xical comparison routine is used.)-.15 F(If)5.192 E F1(pr)2.692 E(e\214x)-.37
-E F0 .192(is NULL and a comparison rou-)2.692 F
-(tine is speci\214ed, no pre\214x comparison is done.)144 297.6 Q .79
-(If the \214le already e)108 314.4 R .79(xists \(and the O_TR)-.15 F .79
-(UNC \215ag is not speci\214ed\), the v)-.4 F .79
-(alues speci\214ed for the parameters)-.25 F
-(\215ags, lorder and psize are ignored in f)108 326.4 Q -.2(avo)-.1 G 2.5(ro).2
-G 2.5(ft)284.4 326.4 S(he v)293.01 326.4 Q(alues used when the tree w)-.25 E
-(as created.)-.1 E -.15(Fo)108 343.2 S(rw).15 E
-(ard sequential scans of a tree are from the least k)-.1 E .3 -.15(ey t)-.1 H
-2.5(ot).15 G(he greatest.)348.55 343.2 Q 1.043(Space freed up by deleting k)108
-360 R -.15(ey)-.1 G 1.043(/data pairs from the tree is ne).15 F -.15(ve)-.25 G
-3.543(rr).15 G 1.043(eclaimed, although it is normally made)378.686 360 R -.2
-(av)108 372 S 1.394(ailable for reuse.)-.05 F 1.394
-(This means that the btree storage structure is gro)6.394 F(w-only)-.25 E 6.395
-(.T)-.65 G 1.395(he only solutions are to)441.09 372 R -.2(avo)108 384 S(id e)
-.2 E(xcessi)-.15 E .3 -.15(ve d)-.25 H
-(eletions, or to create a fresh tree periodically from a scan of an e).15 E
-(xisting one.)-.15 E .344(Searches, insertions, and deletions in a btree will \
-all complete in O lg base N where base is the a)108 400.8 R -.15(ve)-.2 G .343
-(rage \214ll).15 F -.1(fa)108 412.8 S(ctor).1 E 5.798(.O)-.55 G .799
-(ften, inserting ordered data into btrees results in a lo)146.188 412.8 R 3.299
-<778c>-.25 G .799(ll f)377.505 412.8 R(actor)-.1 E 5.799(.T)-.55 G .799
-(his implementation has been)423.443 412.8 R(modi\214ed to mak)108 424.8 Q 2.5
-(eo)-.1 G(rdered insertion the best case, resulting in a much better than norm\
-al page \214ll f)185.4 424.8 Q(actor)-.1 E(.)-.55 E/F3 9/Times-Bold@0 SF
-(SEE ALSO)72 441.6 Q F1(dbopen)108 453.6 Q F0(\(3\),).24 E F1(hash)2.5 E F0
-(\(3\),).28 E F1(mpool)2.5 E F0(\(3\),).51 E F1 -.37(re)2.5 G(cno).37 E F0
-(\(3\)).18 E F1(The Ubiquitous B-tr)108 477.6 Q(ee)-.37 E F0 2.5(,D).18 G
-(ouglas Comer)209.47 477.6 Q 2.5(,A)-.4 G(CM Comput. Surv)276.72 477.6 Q 2.5
-(.1)-.65 G(1, 2 \(June 1979\), 121-138.)360.25 477.6 Q F1(Pr)108 501.6 Q 1.588
-(e\214x B-tr)-.37 F(ees)-.37 E F0 4.088(,B).27 G 1.587(ayer and Unterauer)
-177.636 501.6 R 4.087(,A)-.4 G 1.587(CM T)270.447 501.6 R 1.587
-(ransactions on Database Systems, V)-.35 F 1.587(ol. 2, 1 \(March 1977\),)-1.29
-F(11-26.)108 513.6 Q F1(The Art of Computer Pr)108 537.6 Q -.1(og)-.45 G -.15
-(ra).1 G(mming V).15 E(ol. 3: Sorting and Sear)-1.11 E -.15(ch)-.37 G(ing).15 E
-F0 2.5(,D).22 G(.E. Knuth, 1968, pp 471-480.)382 537.6 Q F3 -.09(BU)72 554.4 S
-(GS).09 E F0(Only big and little endian byte order is supported.)108 566.4 Q
-174.135(4.4BSD June)72 732 R(4, 1993)2.5 E(2)535 732 Q EP
-%%Trailer
-end
-%%EOF
diff --git a/src/util/db2/docs/dbopen.3.ps b/src/util/db2/docs/dbopen.3.ps
deleted file mode 100644
index c621bef97d..0000000000
--- a/src/util/db2/docs/dbopen.3.ps
+++ /dev/null
@@ -1,508 +0,0 @@
-%!PS-Adobe-3.0
-%%Creator: groff version 1.08
-%%DocumentNeededResources: font Times-Roman
-%%+ font Times-Bold
-%%+ font Times-Italic
-%%DocumentSuppliedResources: procset grops 1.08 0
-%%Pages: 4
-%%PageOrder: Ascend
-%%Orientation: Portrait
-%%EndComments
-%%BeginProlog
-%%BeginResource: procset grops 1.08 0
-/setpacking where{
-pop
-currentpacking
-true setpacking
-}if
-/grops 120 dict dup begin
-/SC 32 def
-/A/show load def
-/B{0 SC 3 -1 roll widthshow}bind def
-/C{0 exch ashow}bind def
-/D{0 exch 0 SC 5 2 roll awidthshow}bind def
-/E{0 rmoveto show}bind def
-/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
-/G{0 rmoveto 0 exch ashow}bind def
-/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/I{0 exch rmoveto show}bind def
-/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
-/K{0 exch rmoveto 0 exch ashow}bind def
-/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/M{rmoveto show}bind def
-/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
-/O{rmoveto 0 exch ashow}bind def
-/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/Q{moveto show}bind def
-/R{moveto 0 SC 3 -1 roll widthshow}bind def
-/S{moveto 0 exch ashow}bind def
-/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/SF{
-findfont exch
-[exch dup 0 exch 0 exch neg 0 0]makefont
-dup setfont
-[exch/setfont cvx]cvx bind def
-}bind def
-/MF{
-findfont
-[5 2 roll
-0 3 1 roll
-neg 0 0]makefont
-dup setfont
-[exch/setfont cvx]cvx bind def
-}bind def
-/level0 0 def
-/RES 0 def
-/PL 0 def
-/LS 0 def
-/PLG{
-gsave newpath clippath pathbbox grestore
-exch pop add exch pop
-}bind def
-/BP{
-/level0 save def
-1 setlinecap
-1 setlinejoin
-72 RES div dup scale
-LS{
-90 rotate
-}{
-0 PL translate
-}ifelse
-1 -1 scale
-}bind def
-/EP{
-level0 restore
-showpage
-}bind def
-/DA{
-newpath arcn stroke
-}bind def
-/SN{
-transform
-.25 sub exch .25 sub exch
-round .25 add exch round .25 add exch
-itransform
-}bind def
-/DL{
-SN
-moveto
-SN
-lineto stroke
-}bind def
-/DC{
-newpath 0 360 arc closepath
-}bind def
-/TM matrix def
-/DE{
-TM currentmatrix pop
-translate scale newpath 0 0 .5 0 360 arc closepath
-TM setmatrix
-}bind def
-/RC/rcurveto load def
-/RL/rlineto load def
-/ST/stroke load def
-/MT/moveto load def
-/CL/closepath load def
-/FL{
-currentgray exch setgray fill setgray
-}bind def
-/BL/fill load def
-/LW/setlinewidth load def
-/RE{
-findfont
-dup maxlength 1 index/FontName known not{1 add}if dict begin
-{
-1 index/FID ne{def}{pop pop}ifelse
-}forall
-/Encoding exch def
-dup/FontName exch def
-currentdict end definefont pop
-}bind def
-/DEFS 0 def
-/EBEGIN{
-moveto
-DEFS begin
-}bind def
-/EEND/end load def
-/CNT 0 def
-/level1 0 def
-/PBEGIN{
-/level1 save def
-translate
-div 3 1 roll div exch scale
-neg exch neg exch translate
-0 setgray
-0 setlinecap
-1 setlinewidth
-0 setlinejoin
-10 setmiterlimit
-[]0 setdash
-/setstrokeadjust where{
-pop
-false setstrokeadjust
-}if
-/setoverprint where{
-pop
-false setoverprint
-}if
-newpath
-/CNT countdictstack def
-userdict begin
-/showpage{}def
-}bind def
-/PEND{
-clear
-countdictstack CNT sub{end}repeat
-level1 restore
-}bind def
-end def
-/setpacking where{
-pop
-setpacking
-}if
-%%EndResource
-%%IncludeResource: font Times-Roman
-%%IncludeResource: font Times-Bold
-%%IncludeResource: font Times-Italic
-grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL
-792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron/scaron/zcaron
-/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space
-/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft
-/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four
-/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C
-/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash
-/bracketright/circumflex/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q
-/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase
-/guillemotleft/guillemotright/bullet/florin/fraction/perthousand/dagger
-/daggerdbl/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
-/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
-/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar
-/section/dieresis/copyright/ordfeminine/guilsinglleft/logicalnot/minus
-/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu
-/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guilsinglright
-/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde
-/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute
-/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
-/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls
-/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute
-/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve
-/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex
-/udieresis/yacute/thorn/ydieresis]def/Times-Italic@0 ENC0/Times-Italic RE
-/Times-Bold@0 ENC0/Times-Bold RE/Times-Roman@0 ENC0/Times-Roman RE
-%%EndProlog
-%%Page: 1 1
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 124.01(DBOPEN\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 124.01(anual DBOPEN\(3\))340.17 48 R/F1 9/Times-Bold@0 SF -.18(NA)72
-84 S(ME).18 E F0(dbopen \255 database access methods)108 96 Q F1(SYNOPSIS)72
-112.8 Q/F2 10/Times-Bold@0 SF(#include <sys/types.h>)108 124.8 Q
-(#include <limits.h>)108 136.8 Q(#include <db)108 148.8 Q(.h>)-.4 E(DB *)108
-172.8 Q(dbopen\(const char *\214le, int \215ags, int mode, DBTYPE type,)108
-184.8 Q(const v)158 196.8 Q(oid *openinf)-.1 E(o\);)-.25 E F1(DESCRIPTION)72
-213.6 Q/F3 10/Times-Italic@0 SF(Dbopen)108 225.6 Q F0 .032
-(is the library interf)2.532 F .031(ace to database \214les.)-.1 F .031
-(The supported \214le formats are btree, hashed and UNIX \214le)5.031 F 2.82
-(oriented. The)108 237.6 R .32
-(btree format is a representation of a sorted, balanced tree structure.)2.82 F
-.321(The hashed format is an)5.321 F -.15(ex)108 249.6 S .424
-(tensible, dynamic hashing scheme.).15 F .423
-(The \215at-\214le format is a byte stream \214le with \214x)5.423 F .423
-(ed or v)-.15 F .423(ariable length)-.25 F 2.906(records. The)108 261.6 R .407
-(formats and \214le format speci\214c information are described in detail in t\
-heir respecti)2.906 F .707 -.15(ve m)-.25 H(anual).15 E(pages)108 273.6 Q F3
-(btr)2.5 E(ee)-.37 E F0(\(3\),).18 E F3(hash)2.5 E F0(\(3\) and).28 E F3 -.37
-(re)2.5 G(cno).37 E F0(\(3\).).18 E .433(Dbopen opens)108 290.4 R F3(\214le)
-2.933 E F0 .433(for reading and/or writing.)2.933 F .433(Files ne)5.433 F -.15
-(ve)-.25 G 2.933(ri).15 G .433(ntended to be preserv)346.737 290.4 R .433
-(ed on disk may be created)-.15 F(by setting the \214le parameter to NULL.)108
-302.4 Q(The)108 319.2 Q F3<8d61>4.661 E(gs)-.1 E F0(and)4.661 E F3 2.161
-(mode ar)4.661 F(guments)-.37 E F0 2.161(are as speci\214ed to the)4.661 F F3
-(open)4.661 E F0 2.162(\(2\) routine, ho).24 F(we)-.25 E -.15(ve)-.25 G 2.962
--.4(r, o).15 H 2.162(nly the O_CREA).4 F -.74(T,)-1.11 G .128
-(O_EXCL, O_EXLOCK, O_NONBLOCK, O_RDONL)108 331.2 R 2.708 -1.29(Y, O)-1 H(_RD)
-1.29 E .128(WR, O_SHLOCK and O_TR)-.3 F .127(UNC \215ags are)-.4 F 2.5
-(meaningful. \(Note,)108 343.2 R(opening a database \214le O_WR)2.5 E(ONL)-.4 E
-2.5(Yi)-1 G 2.5(sn)342.67 343.2 S(ot possible.\))354.06 343.2 Q(The)108 360 Q
-F3(type)5.337 E F0(ar)5.337 E 2.837
-(gument is of type DBTYPE \(as de\214ned in the <db)-.18 F 2.838
-(.h> include \214le\) and may be set to)-.4 F(DB_BTREE, DB_HASH or DB_RECNO.)
-108 372 Q(The)108 388.8 Q F3(openinfo)2.85 E F0(ar)2.85 E .349(gument is a poi\
-nter to an access method speci\214c structure described in the access method')
--.18 F(s)-.55 E .03(manual page.)108 400.8 R(If)5.03 E F3(openinfo)2.53 E F0
-.031(is NULL, each access method will use def)2.53 F .031
-(aults appropriate for the system and the)-.1 F(access method.)108 412.8 Q F3
-(Dbopen)108 429.6 Q F0 .416
-(returns a pointer to a DB structure on success and NULL on error)2.917 F 5.416
-(.T)-.55 G .416(he DB structure is de\214ned in)423.21 429.6 R(the <db)108
-441.6 Q(.h> include \214le, and contains at least the follo)-.4 E
-(wing \214elds:)-.25 E(typedef struct {)108 465.6 Q(DBTYPE type;)144 477.6 Q
-(int \(*close\)\(const DB *db\);)144 489.6 Q
-(int \(*del\)\(const DB *db, const DBT *k)144 501.6 Q -.15(ey)-.1 G 2.5(,u)-.5
-G(_int \215ags\);)318.92 501.6 Q(int \(*fd\)\(const DB *db\);)144 513.6 Q
-(int \(*get\)\(const DB *db, DBT *k)144 525.6 Q -.15(ey)-.1 G 2.5(,D)-.5 G
-(BT *data, u_int \215ags\);)297.53 525.6 Q(int \(*put\)\(const DB *db, DBT *k)
-144 537.6 Q -.15(ey)-.1 G 2.5(,c)-.5 G(onst DBT *data,)295.31 537.6 Q
-(u_int \215ags\);)194 549.6 Q(int \(*sync\)\(const DB *db, u_int \215ags\);)144
-561.6 Q(int \(*seq\)\(const DB *db, DBT *k)144 573.6 Q -.15(ey)-.1 G 2.5(,D)-.5
-G(BT *data, u_int \215ags\);)298.64 573.6 Q 2.5(}D)108 585.6 S(B;)122.52 585.6
-Q .101
-(These elements describe a database type and a set of functions performing v)
-108 602.4 R .101(arious actions.)-.25 F .101(These functions)5.101 F(tak)108
-614.4 Q 3.039(eap)-.1 G .539(ointer to a structure as returned by)140.078 614.4
-R F3(dbopen)3.038 E F0 3.038(,a).24 G .538
-(nd sometimes one or more pointers to k)323.196 614.4 R -.15(ey)-.1 G .538
-(/data struc-).15 F(tures and a \215ag v)108 626.4 Q(alue.)-.25 E 16.28
-(type The)108 643.2 R
-(type of the underlying access method \(and \214le format\).)2.5 E 12.95
-(close A)108 660 R .988(pointer to a routine to \215ush an)3.488 F 3.489(yc)
--.15 G .989(ached information to disk, free an)293.968 660 R 3.489(ya)-.15 G
-.989(llocated resources, and)446.662 660 R .112
-(close the underlying \214le\(s\).)144 672 R .111(Since k)5.112 F -.15(ey)-.1 G
-.111(/data pairs may be cached in memory).15 F 2.611(,f)-.65 G .111
-(ailing to sync the \214le)455.666 672 R .494(with a)144 684 R F3(close)2.994 E
-F0(or)2.994 E F3(sync)2.994 E F0 .495
-(function may result in inconsistent or lost information.)2.994 F F3(Close)
-5.495 E F0 .495(routines return)2.995 F(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15
-G(istrib)132.57 732 Q 89.875(ution September)-.2 F(13, 1993)2.5 E(1)535 732 Q
-EP
-%%Page: 2 2
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 124.01(DBOPEN\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 124.01(anual DBOPEN\(3\))340.17 48 R(-1 on error \(setting)144 84 Q
-/F1 10/Times-Italic@0 SF(errno)2.5 E F0 2.5(\)a).18 G(nd 0 on success.)254.43
-84 Q 21.28(del A)108 100.8 R(pointer to a routine to remo)2.5 E .3 -.15(ve k)
--.15 H -.15(ey).05 G(/data pairs from the database.).15 E(The parameter)144
-117.6 Q F1<8d61>2.5 E(g)-.1 E F0(may be set to the follo)2.5 E(wing v)-.25 E
-(alue:)-.25 E(R_CURSOR)144 134.4 Q .289
-(Delete the record referenced by the cursor)180 146.4 R 5.288(.T)-.55 G .288
-(he cursor must ha)363.342 146.4 R .588 -.15(ve p)-.2 H(re).15 E .288
-(viously been initial-)-.25 F(ized.)180 158.4 Q F1(Delete)144 175.2 Q F0 .03
-(routines return -1 on error \(setting)2.53 F F1(errno)2.53 E F0 .03
-(\), 0 on success, and 1 if the speci\214ed).18 F F1 -.1(ke)2.53 G(y)-.2 E F0
--.1(wa)2.53 G 2.53(sn).1 G .03(ot in)521.91 175.2 R(the \214le.)144 187.2 Q
-25.17(fd A)108 204 R .451
-(pointer to a routine which returns a \214le descriptor representati)2.951 F
-.75 -.15(ve o)-.25 H 2.95(ft).15 G .45(he underlying database.)431.73 204 R(A)
-5.45 E .942(\214le descriptor referencing the same \214le will be returned to \
-all processes which call)144 216 R F1(dbopen)3.442 E F0(with)3.442 E 1.629
-(the same)144 228 R F1(\214le)4.129 E F0 4.129(name. This)4.129 F 1.628
-(\214le descriptor may be safely used as a ar)4.128 F 1.628(gument to the)-.18
-F F1(fcntl)4.128 E F0 1.628(\(2\) and).51 F F1(\215oc)144 240 Q(k)-.2 E F0 .425
-(\(2\) locking functions.).67 F .425
-(The \214le descriptor is not necessarily associated with an)5.425 F 2.925(yo)
--.15 G 2.925(ft)492.7 240 S .425(he under)501.735 240 R(-)-.2 E .198
-(lying \214les used by the access method.)144 252 R .198
-(No \214le descriptor is a)5.198 F -.25(va)-.2 G .198
-(ilable for in memory databases.).25 F F1(Fd)5.198 E F0
-(routines return -1 on error \(setting)144 264 Q F1(errno)2.5 E F0
-(\), and the \214le descriptor on success.).18 E 21.28(get A)108 280.8 R
-(pointer to a routine which is the interf)2.5 E .001(ace for k)-.1 F -.15(ey)
--.1 G .001(ed retrie).15 F -.25(va)-.25 G 2.501(lf).25 G .001
-(rom the database.)399.755 280.8 R .001(The address and)5.001 F .061
-(length of the data associated with the speci\214ed)144 292.8 R F1 -.1(ke)2.561
-G(y)-.2 E F0 .06(are returned in the structure referenced by)2.561 F F1(data)
-2.56 E F0(.).26 E F1(Get)144 304.8 Q F0(routines return -1 on error \(setting)
-2.5 E F1(errno)2.5 E F0(\), 0 on success, and 1 if the).18 E F1 -.1(ke)2.5 G(y)
--.2 E F0 -.1(wa)2.5 G 2.5(sn).1 G(ot in the \214le.)471.66 304.8 Q 20.72(put A)
-108 321.6 R(pointer to a routine to store k)2.5 E -.15(ey)-.1 G
-(/data pairs in the database.).15 E(The parameter)144 338.4 Q F1<8d61>2.5 E(g)
--.1 E F0(may be set to one of the follo)2.5 E(wing v)-.25 E(alues:)-.25 E
-(R_CURSOR)144 355.2 Q .051(Replace the k)180 367.2 R -.15(ey)-.1 G .051
-(/data pair referenced by the cursor).15 F 5.052(.T)-.55 G .052
-(he cursor must ha)393.98 367.2 R .352 -.15(ve p)-.2 H(re).15 E .052
-(viously been)-.25 F(initialized.)180 379.2 Q(R_IAFTER)144 396 Q 1.165
-(Append the data immediately after the data referenced by)180 408 R F1 -.1(ke)
-3.664 G(y)-.2 E F0 3.664(,c).32 G 1.164(reating a ne)446.758 408 R 3.664(wk)
--.25 G -.15(ey)511.27 408 S(/data).15 E(pair)180 420 Q 6.065(.T)-.55 G 1.065
-(he record number of the appended k)209.675 420 R -.15(ey)-.1 G 1.065
-(/data pair is returned in the).15 F F1 -.1(ke)3.565 G(y)-.2 E F0(structure.)
-3.565 E(\(Applicable only to the DB_RECNO access method.\))180 432 Q(R_IBEFORE)
-144 448.8 Q 1.293(Insert the data immediately before the data referenced by)180
-460.8 R F1 -.1(ke)3.793 G(y)-.2 E F0 3.793(,c).32 G 1.293(reating a ne)446.371
-460.8 R 3.793(wk)-.25 G -.15(ey)511.27 460.8 S(/data).15 E(pair)180 472.8 Q
-6.54(.T)-.55 G 1.54(he record number of the inserted k)210.15 472.8 R -.15(ey)
--.1 G 1.541(/data pair is returned in the).15 F F1 -.1(ke)4.041 G(y)-.2 E F0
-(structure.)4.041 E(\(Applicable only to the DB_RECNO access method.\))180
-484.8 Q(R_NOO)144 501.6 Q(VER)-.5 E(WRITE)-.55 E(Enter the ne)180 513.6 Q 2.5
-(wk)-.25 G -.15(ey)242.69 513.6 S(/data pair only if the k).15 E .3 -.15(ey d)
--.1 H(oes not pre).15 E(viously e)-.25 E(xist.)-.15 E(R_SETCURSOR)144 530.4 Q
-1.36(Store the k)180 542.4 R -.15(ey)-.1 G 1.36(/data pair).15 F 3.86(,s)-.4 G
-1.359(etting or initializing the position of the cursor to reference it.)283.94
-542.4 R(\(Applicable only to the DB_BTREE and DB_RECNO access methods.\))180
-554.4 Q .563(R_SETCURSOR is a)144 571.2 R -.25(va)-.2 G .564
-(ilable only for the DB_BTREE and DB_RECNO access methods because).25 F
-(it implies that the k)144 583.2 Q -.15(ey)-.1 G 2.5(sh).15 G -2.25 -.2(av e)
-241.81 583.2 T(an inherent order which does not change.)2.7 E .416
-(R_IAFTER and R_IBEFORE are a)144 600 R -.25(va)-.2 G .416
-(ilable only for the DB_RECNO access method because the).25 F(y)-.15 E 1.221
-(each imply that the access method is able to create ne)144 612 R 3.722(wk)-.25
-G -.15(ey)385.644 612 S 3.722(s. This).15 F 1.222(is only true if the k)3.722 F
--.15(ey)-.1 G 3.722(sa).15 G(re)532.23 612 Q
-(ordered and independent, record numbers for e)144 624 Q(xample.)-.15 E .289
-(The def)144 640.8 R .289(ault beha)-.1 F .289(vior of the)-.2 F F1(put)2.789 E
-F0 .289(routines is to enter the ne)2.789 F 2.789(wk)-.25 G -.15(ey)388.998
-640.8 S .288(/data pair).15 F 2.788(,r)-.4 G .288(eplacing an)444.284 640.8 R
-2.788(yp)-.15 G(re)503.03 640.8 Q(viously)-.25 E -.15(ex)144 652.8 S(isting k)
-.15 E -.15(ey)-.1 G(.)-.5 E F1(Put)144 669.6 Q F0 .37
-(routines return -1 on error \(setting)2.87 F F1(errno)2.87 E F0 .37
-(\), 0 on success, and 1 if the R_NOO).18 F(VER)-.5 E(WRITE)-.55 E F1<8d61>2.87
-E(g)-.1 E F0 -.1(wa)144 681.6 S 2.5(ss).1 G(et and the k)165.84 681.6 Q .3 -.15
-(ey a)-.1 H(lready e).15 E(xists in the \214le.)-.15 E(4.4 Berk)72 732 Q(ele)
--.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q 89.875(ution September)-.2 F(13, 1993)
-2.5 E(2)535 732 Q EP
-%%Page: 3 3
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 124.01(DBOPEN\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 124.01(anual DBOPEN\(3\))340.17 48 R 20.17(seq A)108 84 R .002
-(pointer to a routine which is the interf)2.502 F .002
-(ace for sequential retrie)-.1 F -.25(va)-.25 G 2.502(lf).25 G .002
-(rom the database.)416.694 84 R .001(The address)5.001 F .219
-(and length of the k)144 96 R .519 -.15(ey a)-.1 H .219
-(re returned in the structure referenced by).15 F/F1 10/Times-Italic@0 SF -.1
-(ke)2.72 G(y)-.2 E F0 2.72(,a).32 G .22(nd the address and length of)426.42 96
-R(the data are returned in the structure referenced by)144 108 Q F1(data)2.5 E
-F0(.).26 E .937(Sequential k)144 124.8 R -.15(ey)-.1 G .937(/data pair retrie)
-.15 F -.25(va)-.25 G 3.437(lm).25 G .936(ay be)289.748 124.8 R .936(gin at an)
--.15 F 3.436(yt)-.15 G .936(ime, and the position of the `)359.292 124.8 R
-(`cursor')-.74 E 3.436('i)-.74 G 3.436(sn)519.894 124.8 S(ot)532.22 124.8 Q(af)
-144 136.8 Q 1.585(fected by calls to the)-.25 F F1(del)4.085 E F0(,).51 E F1
--.1(ge)4.085 G(t).1 E F0(,).68 E F1(put)4.086 E F0 4.086(,o).68 G(r)308.452
-136.8 Q F1(sync)4.086 E F0 4.086(routines. Modi\214cations)4.086 F 1.586
-(to the database during a)4.086 F 1.404(sequential scan will be re\215ected in\
- the scan, i.e. records inserted behind the cursor will not be)144 148.8 R
-(returned while records inserted in front of the cursor will be returned.)144
-160.8 Q(The \215ag v)144 177.6 Q(alue)-.25 E/F2 10/Times-Bold@0 SF(must)2.5 E
-F0(be set to one of the follo)2.5 E(wing v)-.25 E(alues:)-.25 E(R_CURSOR)144
-194.4 Q .523(The data associated with the speci\214ed k)180 206.4 R .824 -.15
-(ey i)-.1 H 3.024(sr).15 G 3.024(eturned. This)367.236 206.4 R(dif)3.024 E .524
-(fers from the)-.25 F F1 -.1(ge)3.024 G(t).1 E F0(routines)3.024 E 1.143
-(in that it sets or initializes the cursor to the location of the k)180 218.4 R
-1.443 -.15(ey a)-.1 H 3.642(sw).15 G 3.642(ell. \(Note,)464.924 218.4 R 1.142
-(for the)3.642 F 1.275(DB_BTREE access method, the returned k)180 230.4 R 1.575
--.15(ey i)-.1 H 3.775(sn).15 G 1.276(ot necessarily an e)386.425 230.4 R 1.276
-(xact match for the)-.15 F .598(speci\214ed k)180 242.4 R -.15(ey)-.1 G 5.598
-(.T)-.5 G .598(he returned k)246.396 242.4 R .898 -.15(ey i)-.1 H 3.098(st).15
-G .598(he smallest k)325.188 242.4 R .898 -.15(ey g)-.1 H .598
-(reater than or equal to the speci\214ed).15 F -.1(ke)180 254.4 S 1.3 -.65
-(y, p)-.05 H(ermitting partial k).65 E .3 -.15(ey m)-.1 H
-(atches and range searches.\)).15 E(R_FIRST)144 271.2 Q 1.043(The \214rst k)180
-283.2 R -.15(ey)-.1 G 1.044(/data pair of the database is returned, and the cu\
-rsor is set or initialized to).15 F(reference it.)180 295.2 Q(R_LAST)144 312 Q
-.085(The last k)180 324 R -.15(ey)-.1 G .085(/data pair of the database is ret\
-urned, and the cursor is set or initialized to ref-).15 F(erence it.)180 336 Q
-(\(Applicable only to the DB_BTREE and DB_RECNO access methods.\))5 E(R_NEXT)
-144 352.8 Q(Retrie)180 364.8 Q .604 -.15(ve t)-.25 H .304(he k).15 F -.15(ey)
--.1 G .304(/data pair immediately after the cursor).15 F 5.304(.I)-.55 G 2.804
-(ft)410.622 364.8 S .305(he cursor is not yet set, this is)419.536 364.8 R
-(the same as the R_FIRST \215ag.)180 376.8 Q(R_PREV)144 393.6 Q(Retrie)180
-405.6 Q .755 -.15(ve t)-.25 H .455(he k).15 F -.15(ey)-.1 G .455
-(/data pair immediately before the cursor).15 F 5.455(.I)-.55 G 2.955(ft)419.05
-405.6 S .454(he cursor is not yet set, this)428.115 405.6 R .62
-(is the same as the R_LAST \215ag.)180 417.6 R .621
-(\(Applicable only to the DB_BTREE and DB_RECNO)5.621 F(access methods.\))180
-429.6 Q .911(R_LAST and R_PREV are a)144 446.4 R -.25(va)-.2 G .911
-(ilable only for the DB_BTREE and DB_RECNO access methods).25 F(because the)144
-458.4 Q 2.5(ye)-.15 G(ach imply that the k)202.16 458.4 Q -.15(ey)-.1 G 2.5(sh)
-.15 G -2.25 -.2(av e)302.18 458.4 T(an inherent order which does not change.)
-2.7 E F1(Seq)144 475.2 Q F0 .061(routines return -1 on error \(setting)2.561 F
-F1(errno)2.561 E F0 .061(\), 0 on success and 1 if there are no k).18 F -.15
-(ey)-.1 G .061(/data pairs less).15 F .35
-(than or greater than the speci\214ed or current k)144 487.2 R -.15(ey)-.1 G
-5.349(.I)-.5 G 2.849(ft)346.467 487.2 S .349
-(he DB_RECNO access method is being used,)355.426 487.2 R .025
-(and if the database \214le is a character special \214le and no complete k)144
-499.2 R -.15(ey)-.1 G .025(/data pairs are currently a).15 F -.25(va)-.2 G(il-)
-.25 E(able, the)144 511.2 Q F1(seq)2.5 E F0(routines return 2.)2.5 E 15.17
-(sync A)108 528 R .458(pointer to a routine to \215ush an)2.958 F 2.957(yc)-.15
-G .457(ached information to disk.)289.72 528 R .457
-(If the database is in memory only)5.457 F(,)-.65 E(the)144 540 Q F1(sync)2.5 E
-F0(routine has no ef)2.5 E(fect and will al)-.25 E -.1(wa)-.1 G(ys succeed.).1
-E(The \215ag v)144 556.8 Q(alue may be set to the follo)-.25 E(wing v)-.25 E
-(alue:)-.25 E(R_RECNOSYNC)144 573.6 Q .077(If the DB_RECNO access method is be\
-ing used, this \215ag causes the sync routine to apply)180 585.6 R .75(to the \
-btree \214le which underlies the recno \214le, not the recno \214le itself.)180
-597.6 R .75(\(See the)5.75 F F1(bfname)3.25 E F0(\214eld of the)180 609.6 Q F1
--.37(re)2.5 G(cno).37 E F0(\(3\) manual page for more information.\)).18 E F1
-(Sync)144 626.4 Q F0(routines return -1 on error \(setting)2.5 E F1(errno)2.5 E
-F0 2.5(\)a).18 G(nd 0 on success.)336.91 626.4 Q/F3 9/Times-Bold@0 SF(KEY/D)72
-643.2 Q -1.35 -.855(AT A)-.315 H -.666(PA)3.105 G(IRS).666 E F0 .134
-(Access to all \214le types is based on k)108 655.2 R -.15(ey)-.1 G .134
-(/data pairs.).15 F .134(Both k)5.134 F -.15(ey)-.1 G 2.634(sa).15 G .134
-(nd data are represented by the follo)359.078 655.2 R .135(wing data)-.25 F
-(structure:)108 667.2 Q(typedef struct {)108 684 Q(4.4 Berk)72 732 Q(ele)-.1 E
-2.5(yD)-.15 G(istrib)132.57 732 Q 89.875(ution September)-.2 F(13, 1993)2.5 E
-(3)535 732 Q EP
-%%Page: 4 4
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 124.01(DBOPEN\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 124.01(anual DBOPEN\(3\))340.17 48 R -.2(vo)144 84 S(id *data;).2 E
-(size_t size;)144 96 Q 2.5(}D)108 108 S(BT)122.52 108 Q(;)-.55 E
-(The elements of the DBT structure are de\214ned as follo)108 124.8 Q(ws:)-.25
-E 16.84(data A)108 141.6 R(pointer to a byte string.)2.5 E 17.95(size The)108
-158.4 R(length of the byte string.)2.5 E -2.15 -.25(Ke y)108 175.2 T .829(and \
-data byte strings may reference strings of essentially unlimited length althou\
-gh an)3.579 F 3.328(yt)-.15 G 1.028 -.1(wo o)492.894 175.2 T 3.328(ft).1 G(hem)
-522.78 175.2 Q 1.133(must \214t into a)108 187.2 R -.25(va)-.2 G 1.134
-(ilable memory at the same time.).25 F 1.134
-(It should be noted that the access methods pro)6.134 F 1.134(vide no)-.15 F
-(guarantees about byte string alignment.)108 199.2 Q/F1 9/Times-Bold@0 SF(ERR)
-72 216 Q(ORS)-.27 E F0(The)108 228 Q/F2 10/Times-Italic@0 SF(dbopen)3.389 E F0
-.889(routine may f)3.389 F .889(ail and set)-.1 F F2(errno)3.388 E F0 .888
-(for an)3.388 F 3.388(yo)-.15 G 3.388(ft)324.376 228 S .888
-(he errors speci\214ed for the library routines)333.874 228 R F2(open)3.388 E
-F0(\(2\)).24 E(and)108 240 Q F2(malloc)2.5 E F0(\(3\) or the follo).31 E(wing:)
--.25 E([EFTYPE])108 256.8 Q 2.5<418c>144 268.8 S(le is incorrectly formatted.)
-159.28 268.8 Q([EINV)108 285.6 Q(AL])-1.35 E 2.812(Ap)144 297.6 S .313(aramete\
-r has been speci\214ed \(hash function, pad byte etc.\) that is incompatible w\
-ith the current)159.032 297.6 R .406
-(\214le speci\214cation or which is not meaningful for the function \(for e)144
-309.6 R .405(xample, use of the cursor with-)-.15 F .099
-(out prior initialization\) or there is a mismatch between the v)144 321.6 R .1
-(ersion number of \214le and the softw)-.15 F(are.)-.1 E(The)108 338.4 Q F2
-(close)3.469 E F0 .969(routines may f)3.469 F .969(ail and set)-.1 F F2(errno)
-3.469 E F0 .969(for an)3.469 F 3.469(yo)-.15 G 3.469(ft)320.18 338.4 S .969
-(he errors speci\214ed for the library routines)329.759 338.4 R F2(close)3.468
-E F0(\(2\),).18 E F2 -.37(re)108 350.4 S(ad).37 E F0(\(2\),).77 E F2(write)2.5
-E F0(\(2\),).18 E F2(fr)2.5 E(ee)-.37 E F0(\(3\), or).18 E F2(fsync)2.5 E F0
-(\(2\).).31 E(The)108 367.2 Q F2(del)2.969 E F0(,).51 E F2 -.1(ge)2.969 G(t).1
-E F0(,).68 E F2(put)2.969 E F0(and)2.969 E F2(seq)2.969 E F0 .469
-(routines may f)2.969 F .469(ail and set)-.1 F F2(errno)2.97 E F0 .47(for an)
-2.97 F 2.97(yo)-.15 G 2.97(ft)377.59 367.2 S .47
-(he errors speci\214ed for the library rou-)386.67 367.2 R(tines)108 379.2 Q F2
--.37(re)2.5 G(ad).37 E F0(\(2\),).77 E F2(write)2.5 E F0(\(2\),).18 E F2(fr)2.5
-E(ee)-.37 E F0(\(3\) or).18 E F2(malloc)2.5 E F0(\(3\).).31 E(The)108 396 Q F2
-(fd)2.5 E F0(routines will f)2.5 E(ail and set)-.1 E F2(errno)2.5 E F0
-(to ENOENT for in memory databases.)2.5 E(The)108 412.8 Q F2(sync)2.5 E F0
-(routines may f)2.5 E(ail and set)-.1 E F2(errno)2.5 E F0(for an)2.5 E 2.5(yo)
--.15 G 2.5(ft)307.71 412.8 S(he errors speci\214ed for the library routine)
-316.32 412.8 Q F2(fsync)2.5 E F0(\(2\).).31 E F1(SEE ALSO)72 429.6 Q F2(btr)108
-441.6 Q(ee)-.37 E F0(\(3\),).18 E F2(hash)2.5 E F0(\(3\),).28 E F2(mpool)2.5 E
-F0(\(3\),).51 E F2 -.37(re)2.5 G(cno).37 E F0(\(3\)).18 E F2 .904(LIBTP: P)108
-465.6 R(ortable)-.8 E 3.404(,M)-.1 G .904(odular T)189.738 465.6 R -.15(ra)-.55
-G .904(nsactions for UNIX).15 F F0 3.404(,M).94 G(ar)328.884 465.6 Q .904
-(go Seltzer)-.18 F 3.403(,M)-.4 G .903(ichael Olson, USENIX proceedings,)
-392.041 465.6 R -.4(Wi)108 477.6 S(nter 1992.).4 E F1 -.09(BU)72 494.4 S(GS).09
-E F0 .399(The typedef DBT is a mnemonic for `)108 506.4 R .399
-(`data base thang')-.74 F .399(', and w)-.74 F .399
-(as used because noone could think of a rea-)-.1 F(sonable name that w)108
-518.4 Q(asn')-.1 E 2.5(ta)-.18 G(lready used.)216.03 518.4 Q
-(The \214le descriptor interf)108 535.2 Q
-(ace is a kluge and will be deleted in a future v)-.1 E(ersion of the interf)
--.15 E(ace.)-.1 E(None of the access methods pro)108 552 Q(vide an)-.15 E 2.5
-(yf)-.15 G(orm of concurrent access, locking, or transactions.)275.16 552 Q
-(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q 89.875
-(ution September)-.2 F(13, 1993)2.5 E(4)535 732 Q EP
-%%Trailer
-end
-%%EOF
diff --git a/src/util/db2/docs/hash.3.ps b/src/util/db2/docs/hash.3.ps
deleted file mode 100644
index 18303cfb7c..0000000000
--- a/src/util/db2/docs/hash.3.ps
+++ /dev/null
@@ -1,292 +0,0 @@
-%!PS-Adobe-3.0
-%%Creator: groff version 1.08
-%%DocumentNeededResources: font Times-Roman
-%%+ font Times-Bold
-%%+ font Times-Italic
-%%DocumentSuppliedResources: procset grops 1.08 0
-%%Pages: 2
-%%PageOrder: Ascend
-%%Orientation: Portrait
-%%EndComments
-%%BeginProlog
-%%BeginResource: procset grops 1.08 0
-/setpacking where{
-pop
-currentpacking
-true setpacking
-}if
-/grops 120 dict dup begin
-/SC 32 def
-/A/show load def
-/B{0 SC 3 -1 roll widthshow}bind def
-/C{0 exch ashow}bind def
-/D{0 exch 0 SC 5 2 roll awidthshow}bind def
-/E{0 rmoveto show}bind def
-/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
-/G{0 rmoveto 0 exch ashow}bind def
-/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/I{0 exch rmoveto show}bind def
-/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
-/K{0 exch rmoveto 0 exch ashow}bind def
-/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/M{rmoveto show}bind def
-/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
-/O{rmoveto 0 exch ashow}bind def
-/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/Q{moveto show}bind def
-/R{moveto 0 SC 3 -1 roll widthshow}bind def
-/S{moveto 0 exch ashow}bind def
-/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/SF{
-findfont exch
-[exch dup 0 exch 0 exch neg 0 0]makefont
-dup setfont
-[exch/setfont cvx]cvx bind def
-}bind def
-/MF{
-findfont
-[5 2 roll
-0 3 1 roll
-neg 0 0]makefont
-dup setfont
-[exch/setfont cvx]cvx bind def
-}bind def
-/level0 0 def
-/RES 0 def
-/PL 0 def
-/LS 0 def
-/PLG{
-gsave newpath clippath pathbbox grestore
-exch pop add exch pop
-}bind def
-/BP{
-/level0 save def
-1 setlinecap
-1 setlinejoin
-72 RES div dup scale
-LS{
-90 rotate
-}{
-0 PL translate
-}ifelse
-1 -1 scale
-}bind def
-/EP{
-level0 restore
-showpage
-}bind def
-/DA{
-newpath arcn stroke
-}bind def
-/SN{
-transform
-.25 sub exch .25 sub exch
-round .25 add exch round .25 add exch
-itransform
-}bind def
-/DL{
-SN
-moveto
-SN
-lineto stroke
-}bind def
-/DC{
-newpath 0 360 arc closepath
-}bind def
-/TM matrix def
-/DE{
-TM currentmatrix pop
-translate scale newpath 0 0 .5 0 360 arc closepath
-TM setmatrix
-}bind def
-/RC/rcurveto load def
-/RL/rlineto load def
-/ST/stroke load def
-/MT/moveto load def
-/CL/closepath load def
-/FL{
-currentgray exch setgray fill setgray
-}bind def
-/BL/fill load def
-/LW/setlinewidth load def
-/RE{
-findfont
-dup maxlength 1 index/FontName known not{1 add}if dict begin
-{
-1 index/FID ne{def}{pop pop}ifelse
-}forall
-/Encoding exch def
-dup/FontName exch def
-currentdict end definefont pop
-}bind def
-/DEFS 0 def
-/EBEGIN{
-moveto
-DEFS begin
-}bind def
-/EEND/end load def
-/CNT 0 def
-/level1 0 def
-/PBEGIN{
-/level1 save def
-translate
-div 3 1 roll div exch scale
-neg exch neg exch translate
-0 setgray
-0 setlinecap
-1 setlinewidth
-0 setlinejoin
-10 setmiterlimit
-[]0 setdash
-/setstrokeadjust where{
-pop
-false setstrokeadjust
-}if
-/setoverprint where{
-pop
-false setoverprint
-}if
-newpath
-/CNT countdictstack def
-userdict begin
-/showpage{}def
-}bind def
-/PEND{
-clear
-countdictstack CNT sub{end}repeat
-level1 restore
-}bind def
-end def
-/setpacking where{
-pop
-setpacking
-}if
-%%EndResource
-%%IncludeResource: font Times-Roman
-%%IncludeResource: font Times-Bold
-%%IncludeResource: font Times-Italic
-grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL
-792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron/scaron/zcaron
-/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space
-/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft
-/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four
-/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C
-/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash
-/bracketright/circumflex/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q
-/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase
-/guillemotleft/guillemotright/bullet/florin/fraction/perthousand/dagger
-/daggerdbl/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
-/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
-/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar
-/section/dieresis/copyright/ordfeminine/guilsinglleft/logicalnot/minus
-/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu
-/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guilsinglright
-/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde
-/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute
-/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
-/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls
-/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute
-/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve
-/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex
-/udieresis/yacute/thorn/ydieresis]def/Times-Italic@0 ENC0/Times-Italic RE
-/Times-Bold@0 ENC0/Times-Bold RE/Times-Roman@0 ENC0/Times-Roman RE
-%%EndProlog
-%%Page: 1 1
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 136.79(HASH\(3\) BSD)72 48 R(Programmer')2.5 E 2.5(sM)
--.55 G 136.79(anual HASH\(3\))340.17 48 R/F1 9/Times-Bold@0 SF -.18(NA)72 84 S
-(ME).18 E F0(hash \255 hash database access method)108 96 Q F1(SYNOPSIS)72
-112.8 Q/F2 10/Times-Bold@0 SF(#include <sys/types.h>)108 124.8 Q(#include <db)
-108 136.8 Q(.h>)-.4 E F1(DESCRIPTION)72 153.6 Q F0 .29(The routine)108 165.6 R
-/F3 10/Times-Italic@0 SF(dbopen)2.79 E F0 .29(is the library interf)2.79 F .29
-(ace to database \214les.)-.1 F .29
-(One of the supported \214le formats is hash \214les.)5.29 F .974
-(The general description of the database access methods is in)108 177.6 R F3
-(dbopen)3.475 E F0 .975(\(3\), this manual page describes only).24 F
-(the hash speci\214c information.)108 189.6 Q(The hash data structure is an e)
-108 206.4 Q(xtensible, dynamic hashing scheme.)-.15 E .83
-(The access method speci\214c data structure pro)108 223.2 R .83(vided to)-.15
-F F3(dbopen)3.33 E F0 .83(is de\214ned in the <db)3.33 F .83
-(.h> include \214le as fol-)-.4 F(lo)108 235.2 Q(ws:)-.25 E(typedef struct {)
-108 259.2 Q(int bsize;)144 271.2 Q(int cachesize;)144 283.2 Q(int f)144 295.2 Q
--.1(fa)-.25 G(ctor;).1 E(u_long \(*hash\)\(const v)144 307.2 Q
-(oid *, size_t\);)-.2 E(int lorder;)144 319.2 Q(int nelem;)144 331.2 Q 2.5(}H)
-108 343.2 S(ASHINFO;)122.52 343.2 Q
-(The elements of this structure are as follo)108 360 Q(ws:)-.25 E(bsize)108
-376.8 Q F3(Bsize)144 376.8 Q F0 1.393(de\214nes the hash table b)3.893 F(uck)
--.2 E 1.393(et size, and is, by def)-.1 F 1.394(ault, 256 bytes.)-.1 F 1.394
-(It may be preferable to)6.394 F
-(increase the page size for disk-resident tables and tables with lar)144 388.8
-Q(ge data items.)-.18 E(cachesize)108 405.6 Q 3.16(As)144 417.6 S .66
-(uggested maximum size, in bytes, of the memory cache.)158.27 417.6 R .659
-(This v)5.659 F .659(alue is)-.25 F F2(only)3.159 E F0(advisory)3.159 E 3.159
-(,a)-.65 G .659(nd the)514.621 417.6 R
-(access method will allocate more memory rather than f)144 429.6 Q(ail.)-.1 E
--2.1 -.25(ff a)108 446.4 T(ctor).25 E F3(Ffactor)9.7 E F0 .482
-(indicates a desired density within the hash table.)2.981 F .482
-(It is an approximation of the number of)5.482 F -.1(ke)144 458.4 S .429
-(ys allo)-.05 F .429(wed to accumulate in an)-.25 F 2.929(yo)-.15 G .429(ne b)
-291.454 458.4 R(uck)-.2 E .429(et, determining when the hash table gro)-.1 F
-.428(ws or shrinks.)-.25 F(The def)144 470.4 Q(ault v)-.1 E(alue is 8.)-.25 E
-(hash)108 487.2 Q F3(Hash)144 487.2 Q F0 .1(is a user de\214ned hash function.)
-2.6 F .1(Since no hash function performs equally well on all possible)5.1 F
-.924(data, the user may \214nd that the b)144 499.2 R .923
-(uilt-in hash function does poorly on a particular data set.)-.2 F(User)5.923 E
-1.408(speci\214ed hash functions must tak)144 511.2 R 3.909(et)-.1 G 1.609 -.1
-(wo a)293.431 511.2 T -.18(rg).1 G 1.409
-(uments \(a pointer to a byte string and a length\) and).18 F
-(return an u_long to be used as the hash v)144 523.2 Q(alue.)-.25 E 9.62
-(lorder The)108 540 R 1.597(byte order for inte)4.097 F 1.596
-(gers in the stored database metadata.)-.15 F 1.596
-(The number should represent the)6.596 F .688(order as an inte)144 552 R .689
-(ger; for e)-.15 F .689(xample, big endian order w)-.15 F .689
-(ould be the number 4,321.)-.1 F(If)5.689 E F3(lor)3.189 E(der)-.37 E F0 .689
-(is 0 \(no)3.189 F .822(order is speci\214ed\) the current host order is used.)
-144 564 R .822(If the)5.822 F .822(\214le already e)5.822 F .821
-(xists, the speci\214ed v)-.15 F .821(alue is)-.25 F(ignored and the v)144 576
-Q(alue speci\214ed when the tree w)-.25 E(as created is used.)-.1 E(nelem)108
-592.8 Q F3(Nelem)144 592.8 Q F0 .701
-(is an estimate of the \214nal size of the hash table.)3.2 F .701
-(If not set or set too lo)5.701 F 2.001 -.65(w, h)-.25 H .701(ash tables will)
-.65 F -.15(ex)144 604.8 S .448(pand gracefully as k).15 F -.15(ey)-.1 G 2.948
-(sa).15 G .448(re entered, although a slight performance de)255.912 604.8 R
-.447(gradation may be noticed.)-.15 F(The def)144 616.8 Q(ault v)-.1 E
-(alue is 1.)-.25 E .79(If the \214le already e)108 633.6 R .79
-(xists \(and the O_TR)-.15 F .79(UNC \215ag is not speci\214ed\), the v)-.4 F
-.79(alues speci\214ed for the parameters)-.25 F(bsize, f)108 645.6 Q -.1(fa)
--.25 G(ctor).1 E 2.5(,l)-.4 G(order and nelem are ignored and the v)167.23
-645.6 Q(alues speci\214ed when the tree w)-.25 E(as created are used.)-.1 E
-1.232(If a hash function is speci\214ed,)108 662.4 R F3(hash_open)3.731 E F0
-1.231(will attempt to determine if the hash function speci\214ed is the)3.731 F
-(same as the one with which the database w)108 674.4 Q(as created, and will f)
--.1 E(ail if it is not.)-.1 E(Backw)108 691.2 Q .861(ard compatible interf)-.1
-F .861(aces to the routines described in)-.1 F F3(dbm)3.362 E F0 .862
-(\(3\), and).32 F F3(ndbm)3.362 E F0 .862(\(3\) are pro).32 F .862(vided, ho)
--.15 F(we)-.25 E -.15(ve)-.25 G -.4(r,).15 G(4.4 Berk)72 732 Q(ele)-.1 E 2.5
-(yD)-.15 G(istrib)132.57 732 Q 96.815(ution August)-.2 F(17, 1993)2.5 E(1)535
-732 Q EP
-%%Page: 2 2
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 136.79(HASH\(3\) BSD)72 48 R(Programmer')2.5 E 2.5(sM)
--.55 G 136.79(anual HASH\(3\))340.17 48 R(these interf)108 84 Q
-(aces are not compatible with pre)-.1 E(vious \214le formats.)-.25 E/F1 9
-/Times-Bold@0 SF(SEE ALSO)72 100.8 Q/F2 10/Times-Italic@0 SF(btr)108 112.8 Q
-(ee)-.37 E F0(\(3\),).18 E F2(dbopen)2.5 E F0(\(3\),).24 E F2(mpool)2.5 E F0
-(\(3\),).51 E F2 -.37(re)2.5 G(cno).37 E F0(\(3\)).18 E F2(Dynamic Hash T)108
-136.8 Q(ables)-.92 E F0 2.5(,P).27 G(er)206.79 136.8 Q(-Ak)-.2 E 2.5(eL)-.1 G
-(arson, Communications of the A)242.86 136.8 Q(CM, April 1988.)-.4 E F2 2.5(AN)
-108 160.8 S .3 -.15(ew H)123.28 160.8 T(ash P).15 E(ac)-.8 E(ka)-.2 E .2 -.1
-(ge f)-.1 H(or UNIX).1 E F0 2.5(,M).94 G(ar)248.41 160.8 Q(go Seltzer)-.18 E
-2.5(,U)-.4 G(SENIX Proceedings, W)308.09 160.8 Q(inter 1991.)-.4 E F1 -.09(BU)
-72 177.6 S(GS).09 E F0(Only big and little endian byte order is supported.)108
-189.6 Q(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q 96.815
-(ution August)-.2 F(17, 1993)2.5 E(2)535 732 Q EP
-%%Trailer
-end
-%%EOF
diff --git a/src/util/db2/docs/hash.usenix.ps b/src/util/db2/docs/hash.usenix.ps
deleted file mode 100644
index acdea09926..0000000000
--- a/src/util/db2/docs/hash.usenix.ps
+++ /dev/null
@@ -1,12209 +0,0 @@
-%!PS-Adobe-1.0
-%%Creator: utopia:margo (& Seltzer,608-13E,8072,)
-%%Title: stdin (ditroff)
-%%CreationDate: Tue Dec 11 15:06:45 1990
-%%EndComments
-% @(#)psdit.pro 1.3 4/15/88
-% lib/psdit.pro -- prolog for psdit (ditroff) files
-% Copyright (c) 1984, 1985 Adobe Systems Incorporated. All Rights Reserved.
-% last edit: shore Sat Nov 23 20:28:03 1985
-% RCSID: $Header$
-
-% Changed by Edward Wang (edward@ucbarpa.berkeley.edu) to handle graphics,
-% 17 Feb, 87.
-
-/$DITroff 140 dict def $DITroff begin
-/fontnum 1 def /fontsize 10 def /fontheight 10 def /fontslant 0 def
-/xi{0 72 11 mul translate 72 resolution div dup neg scale 0 0 moveto
- /fontnum 1 def /fontsize 10 def /fontheight 10 def /fontslant 0 def F
- /pagesave save def}def
-/PB{save /psv exch def currentpoint translate
- resolution 72 div dup neg scale 0 0 moveto}def
-/PE{psv restore}def
-/arctoobig 90 def /arctoosmall .05 def
-/m1 matrix def /m2 matrix def /m3 matrix def /oldmat matrix def
-/tan{dup sin exch cos div}def
-/point{resolution 72 div mul}def
-/dround {transform round exch round exch itransform}def
-/xT{/devname exch def}def
-/xr{/mh exch def /my exch def /resolution exch def}def
-/xp{}def
-/xs{docsave restore end}def
-/xt{}def
-/xf{/fontname exch def /slotno exch def fontnames slotno get fontname eq not
- {fonts slotno fontname findfont put fontnames slotno fontname put}if}def
-/xH{/fontheight exch def F}def
-/xS{/fontslant exch def F}def
-/s{/fontsize exch def /fontheight fontsize def F}def
-/f{/fontnum exch def F}def
-/F{fontheight 0 le{/fontheight fontsize def}if
- fonts fontnum get fontsize point 0 0 fontheight point neg 0 0 m1 astore
- fontslant 0 ne{1 0 fontslant tan 1 0 0 m2 astore m3 concatmatrix}if
- makefont setfont .04 fontsize point mul 0 dround pop setlinewidth}def
-/X{exch currentpoint exch pop moveto show}def
-/N{3 1 roll moveto show}def
-/Y{exch currentpoint pop exch moveto show}def
-/S{show}def
-/ditpush{}def/ditpop{}def
-/AX{3 -1 roll currentpoint exch pop moveto 0 exch ashow}def
-/AN{4 2 roll moveto 0 exch ashow}def
-/AY{3 -1 roll currentpoint pop exch moveto 0 exch ashow}def
-/AS{0 exch ashow}def
-/MX{currentpoint exch pop moveto}def
-/MY{currentpoint pop exch moveto}def
-/MXY{moveto}def
-/cb{pop}def % action on unknown char -- nothing for now
-/n{}def/w{}def
-/p{pop showpage pagesave restore /pagesave save def}def
-/Dt{/Dlinewidth exch def}def 1 Dt
-/Ds{/Ddash exch def}def -1 Ds
-/Di{/Dstipple exch def}def 1 Di
-/Dsetlinewidth{2 Dlinewidth mul setlinewidth}def
-/Dsetdash{Ddash 4 eq{[8 12]}{Ddash 16 eq{[32 36]}
- {Ddash 20 eq{[32 12 8 12]}{[]}ifelse}ifelse}ifelse 0 setdash}def
-/Dstroke{gsave Dsetlinewidth Dsetdash 1 setlinecap stroke grestore
- currentpoint newpath moveto}def
-/Dl{rlineto Dstroke}def
-/arcellipse{/diamv exch def /diamh exch def oldmat currentmatrix pop
- currentpoint translate 1 diamv diamh div scale /rad diamh 2 div def
- currentpoint exch rad add exch rad -180 180 arc oldmat setmatrix}def
-/Dc{dup arcellipse Dstroke}def
-/De{arcellipse Dstroke}def
-/Da{/endv exch def /endh exch def /centerv exch def /centerh exch def
- /cradius centerv centerv mul centerh centerh mul add sqrt def
- /eradius endv endv mul endh endh mul add sqrt def
- /endang endv endh atan def
- /startang centerv neg centerh neg atan def
- /sweep startang endang sub dup 0 lt{360 add}if def
- sweep arctoobig gt
- {/midang startang sweep 2 div sub def /midrad cradius eradius add 2 div def
- /midh midang cos midrad mul def /midv midang sin midrad mul def
- midh neg midv neg endh endv centerh centerv midh midv Da
- Da}
- {sweep arctoosmall ge
- {/controldelt 1 sweep 2 div cos sub 3 sweep 2 div sin mul div 4 mul def
- centerv neg controldelt mul centerh controldelt mul
- endv neg controldelt mul centerh add endh add
- endh controldelt mul centerv add endv add
- centerh endh add centerv endv add rcurveto Dstroke}
- {centerh endh add centerv endv add rlineto Dstroke}
- ifelse}
- ifelse}def
-/Dpatterns[
-[%cf[widthbits]
-[8<0000000000000010>]
-[8<0411040040114000>]
-[8<0204081020408001>]
-[8<0000103810000000>]
-[8<6699996666999966>]
-[8<0000800100001008>]
-[8<81c36666c3810000>]
-[8<0f0e0c0800000000>]
-[8<0000000000000010>]
-[8<0411040040114000>]
-[8<0204081020408001>]
-[8<0000001038100000>]
-[8<6699996666999966>]
-[8<0000800100001008>]
-[8<81c36666c3810000>]
-[8<0f0e0c0800000000>]
-[8<0042660000246600>]
-[8<0000990000990000>]
-[8<0804020180402010>]
-[8<2418814242811824>]
-[8<6699996666999966>]
-[8<8000000008000000>]
-[8<00001c3e363e1c00>]
-[8<0000000000000000>]
-[32<00000040000000c00000004000000040000000e0000000000000000000000000>]
-[32<00000000000060000000900000002000000040000000f0000000000000000000>]
-[32<000000000000000000e0000000100000006000000010000000e0000000000000>]
-[32<00000000000000002000000060000000a0000000f00000002000000000000000>]
-[32<0000000e0000000000000000000000000000000f000000080000000e00000001>]
-[32<0000090000000600000000000000000000000000000007000000080000000e00>]
-[32<00010000000200000004000000040000000000000000000000000000000f0000>]
-[32<0900000006000000090000000600000000000000000000000000000006000000>]]
-[%ug
-[8<0000020000000000>]
-[8<0000020000002000>]
-[8<0004020000002000>]
-[8<0004020000402000>]
-[8<0004060000402000>]
-[8<0004060000406000>]
-[8<0006060000406000>]
-[8<0006060000606000>]
-[8<00060e0000606000>]
-[8<00060e000060e000>]
-[8<00070e000060e000>]
-[8<00070e000070e000>]
-[8<00070e020070e000>]
-[8<00070e020070e020>]
-[8<04070e020070e020>]
-[8<04070e024070e020>]
-[8<04070e064070e020>]
-[8<04070e064070e060>]
-[8<06070e064070e060>]
-[8<06070e066070e060>]
-[8<06070f066070e060>]
-[8<06070f066070f060>]
-[8<060f0f066070f060>]
-[8<060f0f0660f0f060>]
-[8<060f0f0760f0f060>]
-[8<060f0f0760f0f070>]
-[8<0e0f0f0760f0f070>]
-[8<0e0f0f07e0f0f070>]
-[8<0e0f0f0fe0f0f070>]
-[8<0e0f0f0fe0f0f0f0>]
-[8<0f0f0f0fe0f0f0f0>]
-[8<0f0f0f0ff0f0f0f0>]
-[8<1f0f0f0ff0f0f0f0>]
-[8<1f0f0f0ff1f0f0f0>]
-[8<1f0f0f8ff1f0f0f0>]
-[8<1f0f0f8ff1f0f0f8>]
-[8<9f0f0f8ff1f0f0f8>]
-[8<9f0f0f8ff9f0f0f8>]
-[8<9f0f0f9ff9f0f0f8>]
-[8<9f0f0f9ff9f0f0f9>]
-[8<9f8f0f9ff9f0f0f9>]
-[8<9f8f0f9ff9f8f0f9>]
-[8<9f8f1f9ff9f8f0f9>]
-[8<9f8f1f9ff9f8f1f9>]
-[8<bf8f1f9ff9f8f1f9>]
-[8<bf8f1f9ffbf8f1f9>]
-[8<bf8f1fdffbf8f1f9>]
-[8<bf8f1fdffbf8f1fd>]
-[8<ff8f1fdffbf8f1fd>]
-[8<ff8f1fdffff8f1fd>]
-[8<ff8f1ffffff8f1fd>]
-[8<ff8f1ffffff8f1ff>]
-[8<ff9f1ffffff8f1ff>]
-[8<ff9f1ffffff9f1ff>]
-[8<ff9f9ffffff9f1ff>]
-[8<ff9f9ffffff9f9ff>]
-[8<ffbf9ffffff9f9ff>]
-[8<ffbf9ffffffbf9ff>]
-[8<ffbfdffffffbf9ff>]
-[8<ffbfdffffffbfdff>]
-[8<ffffdffffffbfdff>]
-[8<ffffdffffffffdff>]
-[8<fffffffffffffdff>]
-[8<ffffffffffffffff>]]
-[%mg
-[8<8000000000000000>]
-[8<0822080080228000>]
-[8<0204081020408001>]
-[8<40e0400000000000>]
-[8<66999966>]
-[8<8001000010080000>]
-[8<81c36666c3810000>]
-[8<f0e0c08000000000>]
-[16<07c00f801f003e007c00f800f001e003c007800f001f003e007c00f801f003e0>]
-[16<1f000f8007c003e001f000f8007c003e001f800fc007e003f001f8007c003e00>]
-[8<c3c300000000c3c3>]
-[16<0040008001000200040008001000200040008000000100020004000800100020>]
-[16<0040002000100008000400020001800040002000100008000400020001000080>]
-[16<1fc03fe07df0f8f8f07de03fc01f800fc01fe03ff07df8f87df03fe01fc00f80>]
-[8<80>]
-[8<8040201000000000>]
-[8<84cc000048cc0000>]
-[8<9900009900000000>]
-[8<08040201804020100800020180002010>]
-[8<2418814242811824>]
-[8<66999966>]
-[8<8000000008000000>]
-[8<70f8d8f870000000>]
-[8<0814224180402010>]
-[8<aa00440a11a04400>]
-[8<018245aa45820100>]
-[8<221c224180808041>]
-[8<88000000>]
-[8<0855800080550800>]
-[8<2844004482440044>]
-[8<0810204080412214>]
-[8<00>]]]def
-/Dfill{
- transform /maxy exch def /maxx exch def
- transform /miny exch def /minx exch def
- minx maxx gt{/minx maxx /maxx minx def def}if
- miny maxy gt{/miny maxy /maxy miny def def}if
- Dpatterns Dstipple 1 sub get exch 1 sub get
- aload pop /stip exch def /stipw exch def /stiph 128 def
- /imatrix[stipw 0 0 stiph 0 0]def
- /tmatrix[stipw 0 0 stiph 0 0]def
- /minx minx cvi stiph idiv stiph mul def
- /miny miny cvi stipw idiv stipw mul def
- gsave eoclip 0 setgray
- miny stiph maxy{
- tmatrix exch 5 exch put
- minx stipw maxx{
- tmatrix exch 4 exch put tmatrix setmatrix
- stipw stiph true imatrix {stip} imagemask
- }for
- }for
- grestore
-}def
-/Dp{Dfill Dstroke}def
-/DP{Dfill currentpoint newpath moveto}def
-end
-
-/ditstart{$DITroff begin
- /nfonts 60 def % NFONTS makedev/ditroff dependent!
- /fonts[nfonts{0}repeat]def
- /fontnames[nfonts{()}repeat]def
-/docsave save def
-}def
-
-% character outcalls
-/oc{
- /pswid exch def /cc exch def /name exch def
- /ditwid pswid fontsize mul resolution mul 72000 div def
- /ditsiz fontsize resolution mul 72 div def
- ocprocs name known{ocprocs name get exec}{name cb}ifelse
-}def
-/fractm [.65 0 0 .6 0 0] def
-/fraction{
- /fden exch def /fnum exch def gsave /cf currentfont def
- cf fractm makefont setfont 0 .3 dm 2 copy neg rmoveto
- fnum show rmoveto currentfont cf setfont(\244)show setfont fden show
- grestore ditwid 0 rmoveto
-}def
-/oce{grestore ditwid 0 rmoveto}def
-/dm{ditsiz mul}def
-/ocprocs 50 dict def ocprocs begin
-(14){(1)(4)fraction}def
-(12){(1)(2)fraction}def
-(34){(3)(4)fraction}def
-(13){(1)(3)fraction}def
-(23){(2)(3)fraction}def
-(18){(1)(8)fraction}def
-(38){(3)(8)fraction}def
-(58){(5)(8)fraction}def
-(78){(7)(8)fraction}def
-(sr){gsave 0 .06 dm rmoveto(\326)show oce}def
-(is){gsave 0 .15 dm rmoveto(\362)show oce}def
-(->){gsave 0 .02 dm rmoveto(\256)show oce}def
-(<-){gsave 0 .02 dm rmoveto(\254)show oce}def
-(==){gsave 0 .05 dm rmoveto(\272)show oce}def
-(uc){gsave currentpoint 400 .009 dm mul add translate
- 8 -8 scale ucseal oce}def
-end
-
-% an attempt at a PostScript FONT to implement ditroff special chars
-% this will enable us to
-% cache the little buggers
-% generate faster, more compact PS out of psdit
-% confuse everyone (including myself)!
-50 dict dup begin
-/FontType 3 def
-/FontName /DIThacks def
-/FontMatrix [.001 0 0 .001 0 0] def
-/FontBBox [-260 -260 900 900] def% a lie but ...
-/Encoding 256 array def
-0 1 255{Encoding exch /.notdef put}for
-Encoding
- dup 8#040/space put %space
- dup 8#110/rc put %right ceil
- dup 8#111/lt put %left top curl
- dup 8#112/bv put %bold vert
- dup 8#113/lk put %left mid curl
- dup 8#114/lb put %left bot curl
- dup 8#115/rt put %right top curl
- dup 8#116/rk put %right mid curl
- dup 8#117/rb put %right bot curl
- dup 8#120/rf put %right floor
- dup 8#121/lf put %left floor
- dup 8#122/lc put %left ceil
- dup 8#140/sq put %square
- dup 8#141/bx put %box
- dup 8#142/ci put %circle
- dup 8#143/br put %box rule
- dup 8#144/rn put %root extender
- dup 8#145/vr put %vertical rule
- dup 8#146/ob put %outline bullet
- dup 8#147/bu put %bullet
- dup 8#150/ru put %rule
- dup 8#151/ul put %underline
- pop
-/DITfd 100 dict def
-/BuildChar{0 begin
- /cc exch def /fd exch def
- /charname fd /Encoding get cc get def
- /charwid fd /Metrics get charname get def
- /charproc fd /CharProcs get charname get def
- charwid 0 fd /FontBBox get aload pop setcachedevice
- 2 setlinejoin 40 setlinewidth
- newpath 0 0 moveto gsave charproc grestore
- end}def
-/BuildChar load 0 DITfd put
-/CharProcs 50 dict def
-CharProcs begin
-/space{}def
-/.notdef{}def
-/ru{500 0 rls}def
-/rn{0 840 moveto 500 0 rls}def
-/vr{0 800 moveto 0 -770 rls}def
-/bv{0 800 moveto 0 -1000 rls}def
-/br{0 840 moveto 0 -1000 rls}def
-/ul{0 -140 moveto 500 0 rls}def
-/ob{200 250 rmoveto currentpoint newpath 200 0 360 arc closepath stroke}def
-/bu{200 250 rmoveto currentpoint newpath 200 0 360 arc closepath fill}def
-/sq{80 0 rmoveto currentpoint dround newpath moveto
- 640 0 rlineto 0 640 rlineto -640 0 rlineto closepath stroke}def
-/bx{80 0 rmoveto currentpoint dround newpath moveto
- 640 0 rlineto 0 640 rlineto -640 0 rlineto closepath fill}def
-/ci{500 360 rmoveto currentpoint newpath 333 0 360 arc
- 50 setlinewidth stroke}def
-
-/lt{0 -200 moveto 0 550 rlineto currx 800 2cx s4 add exch s4 a4p stroke}def
-/lb{0 800 moveto 0 -550 rlineto currx -200 2cx s4 add exch s4 a4p stroke}def
-/rt{0 -200 moveto 0 550 rlineto currx 800 2cx s4 sub exch s4 a4p stroke}def
-/rb{0 800 moveto 0 -500 rlineto currx -200 2cx s4 sub exch s4 a4p stroke}def
-/lk{0 800 moveto 0 300 -300 300 s4 arcto pop pop 1000 sub
- 0 300 4 2 roll s4 a4p 0 -200 lineto stroke}def
-/rk{0 800 moveto 0 300 s2 300 s4 arcto pop pop 1000 sub
- 0 300 4 2 roll s4 a4p 0 -200 lineto stroke}def
-/lf{0 800 moveto 0 -1000 rlineto s4 0 rls}def
-/rf{0 800 moveto 0 -1000 rlineto s4 neg 0 rls}def
-/lc{0 -200 moveto 0 1000 rlineto s4 0 rls}def
-/rc{0 -200 moveto 0 1000 rlineto s4 neg 0 rls}def
-end
-
-/Metrics 50 dict def Metrics begin
-/.notdef 0 def
-/space 500 def
-/ru 500 def
-/br 0 def
-/lt 416 def
-/lb 416 def
-/rt 416 def
-/rb 416 def
-/lk 416 def
-/rk 416 def
-/rc 416 def
-/lc 416 def
-/rf 416 def
-/lf 416 def
-/bv 416 def
-/ob 350 def
-/bu 350 def
-/ci 750 def
-/bx 750 def
-/sq 750 def
-/rn 500 def
-/ul 500 def
-/vr 0 def
-end
-
-DITfd begin
-/s2 500 def /s4 250 def /s3 333 def
-/a4p{arcto pop pop pop pop}def
-/2cx{2 copy exch}def
-/rls{rlineto stroke}def
-/currx{currentpoint pop}def
-/dround{transform round exch round exch itransform} def
-end
-end
-/DIThacks exch definefont pop
-ditstart
-(psc)xT
-576 1 1 xr
-1(Times-Roman)xf 1 f
-2(Times-Italic)xf 2 f
-3(Times-Bold)xf 3 f
-4(Times-BoldItalic)xf 4 f
-5(Helvetica)xf 5 f
-6(Helvetica-Bold)xf 6 f
-7(Courier)xf 7 f
-8(Courier-Bold)xf 8 f
-9(Symbol)xf 9 f
-10(DIThacks)xf 10 f
-10 s
-1 f
-xi
-%%EndProlog
-
-%%Page: 1 1
-10 s 10 xH 0 xS 1 f
-3 f
-22 s
-1249 626(A)N
-1420(N)X
-1547(ew)X
-1796(H)X
-1933(ashing)X
-2467(P)X
-2574(ackage)X
-3136(for)X
-3405(U)X
-3532(N)X
-3659(IX)X
-2 f
-20 s
-3855 562(1)N
-1 f
-12 s
-1607 779(Margo)N
-1887(Seltzer)X
-9 f
-2179(-)X
-1 f
-2256(University)X
-2686(of)X
-2790(California,)X
-3229(Berkeley)X
-2015 875(Ozan)N
-2242(Yigit)X
-9 f
-2464(-)X
-1 f
-2541(York)X
-2762(University)X
-3 f
-2331 1086(ABSTRACT)N
-1 f
-10 s
-1152 1222(UNIX)N
-1385(support)X
-1657(of)X
-1756(disk)X
-1921(oriented)X
-2216(hashing)X
-2497(was)X
-2654(originally)X
-2997(provided)X
-3314(by)X
-2 f
-3426(dbm)X
-1 f
-3595([ATT79])X
-3916(and)X
-1152 1310(subsequently)N
-1595(improved)X
-1927(upon)X
-2112(in)X
-2 f
-2199(ndbm)X
-1 f
-2402([BSD86].)X
-2735(In)X
-2826(AT&T)X
-3068(System)X
-3327(V,)X
-3429(in-memory)X
-3809(hashed)X
-1152 1398(storage)N
-1420(and)X
-1572(access)X
-1814(support)X
-2090(was)X
-2251(added)X
-2479(in)X
-2577(the)X
-2 f
-2711(hsearch)X
-1 f
-3000(library)X
-3249(routines)X
-3542([ATT85].)X
-3907(The)X
-1152 1486(result)N
-1367(is)X
-1457(a)X
-1530(system)X
-1789(with)X
-1968(two)X
-2125(incompatible)X
-2580(hashing)X
-2865(schemes,)X
-3193(each)X
-3377(with)X
-3555(its)X
-3666(own)X
-3840(set)X
-3965(of)X
-1152 1574(shortcomings.)N
-1152 1688(This)N
-1316(paper)X
-1517(presents)X
-1802(the)X
-1922(design)X
-2152(and)X
-2289(performance)X
-2717(characteristics)X
-3198(of)X
-3286(a)X
-3343(new)X
-3498(hashing)X
-3768(package)X
-1152 1776(providing)N
-1483(a)X
-1539(superset)X
-1822(of)X
-1909(the)X
-2027(functionality)X
-2456(provided)X
-2761(by)X
-2 f
-2861(dbm)X
-1 f
-3019(and)X
-2 f
-3155(hsearch)X
-1 f
-3409(.)X
-3469(The)X
-3614(new)X
-3768(package)X
-1152 1864(uses)N
-1322(linear)X
-1537(hashing)X
-1818(to)X
-1912(provide)X
-2189(ef\256cient)X
-2484(support)X
-2755(of)X
-2853(both)X
-3026(memory)X
-3324(based)X
-3538(and)X
-3685(disk)X
-3849(based)X
-1152 1952(hash)N
-1319(tables)X
-1526(with)X
-1688(performance)X
-2115(superior)X
-2398(to)X
-2480(both)X
-2 f
-2642(dbm)X
-1 f
-2800(and)X
-2 f
-2936(hsearch)X
-1 f
-3210(under)X
-3413(most)X
-3588(conditions.)X
-3 f
-1380 2128(Introduction)N
-1 f
-892 2260(Current)N
-1196(UNIX)X
-1456(systems)X
-1768(offer)X
-1984(two)X
-2163(forms)X
-2409(of)X
-720 2348(hashed)N
-973(data)X
-1137(access.)X
-2 f
-1413(Dbm)X
-1 f
-1599(and)X
-1745(its)X
-1850(derivatives)X
-2231(provide)X
-720 2436(keyed)N
-939(access)X
-1171(to)X
-1259(disk)X
-1418(resident)X
-1698(data)X
-1858(while)X
-2 f
-2062(hsearch)X
-1 f
-2342(pro-)X
-720 2524(vides)N
-929(access)X
-1175(for)X
-1309(memory)X
-1616(resident)X
-1910(data.)X
-2124(These)X
-2356(two)X
-720 2612(access)N
-979(methods)X
-1302(are)X
-1453(incompatible)X
-1923(in)X
-2037(that)X
-2209(memory)X
-720 2700(resident)N
-1011(hash)X
-1195(tables)X
-1419(may)X
-1593(not)X
-1731(be)X
-1843(stored)X
-2075(on)X
-2191(disk)X
-2360(and)X
-720 2788(disk)N
-884(resident)X
-1169(tables)X
-1387(cannot)X
-1632(be)X
-1739(read)X
-1909(into)X
-2063(memory)X
-2360(and)X
-720 2876(accessed)N
-1022(using)X
-1215(the)X
-1333(in-memory)X
-1709(routines.)X
-2 f
-892 2990(Dbm)N
-1 f
-1091(has)X
-1241(several)X
-1512(shortcomings.)X
-2026(Since)X
-2247(data)X
-2423(is)X
-720 3078(assumed)N
-1032(to)X
-1130(be)X
-1242(disk)X
-1411(resident,)X
-1721(each)X
-1905(access)X
-2146(requires)X
-2440(a)X
-720 3166(system)N
-963(call,)X
-1120(and)X
-1257(almost)X
-1491(certainly,)X
-1813(a)X
-1869(disk)X
-2022(operation.)X
-2365(For)X
-720 3254(extremely)N
-1072(large)X
-1264(databases,)X
-1623(where)X
-1851(caching)X
-2131(is)X
-2214(unlikely)X
-720 3342(to)N
-810(be)X
-914(effective,)X
-1244(this)X
-1386(is)X
-1466(acceptable,)X
-1853(however,)X
-2177(when)X
-2378(the)X
-720 3430(database)N
-1022(is)X
-1100(small)X
-1298(\(i.e.)X
-1447(the)X
-1569(password)X
-1896(\256le\),)X
-2069(performance)X
-720 3518(improvements)N
-1204(can)X
-1342(be)X
-1443(obtained)X
-1744(through)X
-2018(caching)X
-2293(pages)X
-720 3606(of)N
-818(the)X
-947(database)X
-1255(in)X
-1348(memory.)X
-1685(In)X
-1782(addition,)X
-2 f
-2094(dbm)X
-1 f
-2262(cannot)X
-720 3694(store)N
-902(data)X
-1062(items)X
-1261(whose)X
-1492(total)X
-1660(key)X
-1802(and)X
-1943(data)X
-2102(size)X
-2252(exceed)X
-720 3782(the)N
-850(page)X
-1034(size)X
-1191(of)X
-1290(the)X
-1420(hash)X
-1599(table.)X
-1827(Similarly,)X
-2176(if)X
-2257(two)X
-2409(or)X
-720 3870(more)N
-907(keys)X
-1076(produce)X
-1357(the)X
-1477(same)X
-1664(hash)X
-1833(value)X
-2029(and)X
-2166(their)X
-2334(total)X
-720 3958(size)N
-876(exceeds)X
-1162(the)X
-1291(page)X
-1474(size,)X
-1650(the)X
-1779(table)X
-1966(cannot)X
-2210(store)X
-2396(all)X
-720 4046(the)N
-838(colliding)X
-1142(keys.)X
-892 4160(The)N
-1050(in-memory)X
-2 f
-1439(hsearch)X
-1 f
-1725(routines)X
-2015(have)X
-2199(different)X
-720 4248(shortcomings.)N
-1219(First,)X
-1413(the)X
-1539(notion)X
-1771(of)X
-1865(a)X
-1928(single)X
-2146(hash)X
-2320(table)X
-720 4336(is)N
-807(embedded)X
-1171(in)X
-1266(the)X
-1397(interface,)X
-1732(preventing)X
-2108(an)X
-2217(applica-)X
-720 4424(tion)N
-902(from)X
-1116(accessing)X
-1482(multiple)X
-1806(tables)X
-2050(concurrently.)X
-720 4512(Secondly,)N
-1063(the)X
-1186(routine)X
-1438(to)X
-1525(create)X
-1743(a)X
-1804(hash)X
-1976(table)X
-2157(requires)X
-2440(a)X
-720 4600(parameter)N
-1066(which)X
-1286(declares)X
-1573(the)X
-1694(size)X
-1842(of)X
-1932(the)X
-2053(hash)X
-2223(table.)X
-2422(If)X
-720 4688(this)N
-856(size)X
-1001(is)X
-1074(set)X
-1183(too)X
-1305(low,)X
-1465(performance)X
-1892(degradation)X
-2291(or)X
-2378(the)X
-720 4776(inability)N
-1008(to)X
-1092(add)X
-1230(items)X
-1425(to)X
-1509(the)X
-1628(table)X
-1805(may)X
-1964(result.)X
-2223(In)X
-2311(addi-)X
-720 4864(tion,)N
-2 f
-910(hsearch)X
-1 f
-1210(requires)X
-1515(that)X
-1681(the)X
-1825(application)X
-2226(allocate)X
-720 4952(memory)N
-1037(for)X
-1181(the)X
-1329(key)X
-1495(and)X
-1661(data)X
-1845(items.)X
-2108(Lastly,)X
-2378(the)X
-2 f
-720 5040(hsearch)N
-1 f
-1013(routines)X
-1310(provide)X
-1594(no)X
-1713(interface)X
-2034(to)X
-2135(store)X
-2329(hash)X
-720 5128(tables)N
-927(on)X
-1027(disk.)X
-16 s
-720 5593 MXY
-864 0 Dl
-2 f
-8 s
-760 5648(1)N
-1 f
-9 s
-5673(UNIX)Y
-990(is)X
-1056(a)X
-1106(registered)X
-1408(trademark)X
-1718(of)X
-1796(AT&T.)X
-10 s
-2878 2128(The)N
-3032(goal)X
-3199(of)X
-3295(our)X
-3431(work)X
-3625(was)X
-3779(to)X
-3870(design)X
-4108(and)X
-4253(imple-)X
-2706 2216(ment)N
-2900(a)X
-2970(new)X
-3138(package)X
-3436(that)X
-3590(provides)X
-3899(a)X
-3968(superset)X
-4264(of)X
-4364(the)X
-2706 2304(functionality)N
-3144(of)X
-3240(both)X
-2 f
-3411(dbm)X
-1 f
-3578(and)X
-2 f
-3723(hsearch)X
-1 f
-3977(.)X
-4045(The)X
-4198(package)X
-2706 2392(had)N
-2871(to)X
-2982(overcome)X
-3348(the)X
-3495(interface)X
-3826(shortcomings)X
-4306(cited)X
-2706 2480(above)N
-2930(and)X
-3078(its)X
-3185(implementation)X
-3719(had)X
-3867(to)X
-3961(provide)X
-4238(perfor-)X
-2706 2568(mance)N
-2942(equal)X
-3142(or)X
-3235(superior)X
-3524(to)X
-3612(that)X
-3758(of)X
-3851(the)X
-3975(existing)X
-4253(imple-)X
-2706 2656(mentations.)N
-3152(In)X
-3274(order)X
-3498(to)X
-3614(provide)X
-3913(a)X
-4003(compact)X
-4329(disk)X
-2706 2744(representation,)N
-3224(graceful)X
-3531(table)X
-3729(growth,)X
-4018(and)X
-4176(expected)X
-2706 2832(constant)N
-3033(time)X
-3234(performance,)X
-3720(we)X
-3873(selected)X
-4191(Litwin's)X
-2706 2920(linear)N
-2923(hashing)X
-3206(algorithm)X
-3551([LAR88,)X
-3872(LIT80].)X
-4178(We)X
-4324(then)X
-2706 3008(enhanced)N
-3037(the)X
-3161(algorithm)X
-3498(to)X
-3586(handle)X
-3826(page)X
-4004(over\257ows)X
-4346(and)X
-2706 3096(large)N
-2900(key)X
-3049(handling)X
-3362(with)X
-3537(a)X
-3606(single)X
-3830(mechanism,)X
-4248(named)X
-2706 3184(buddy-in-waiting.)N
-3 f
-2975 3338(Existing)N
-3274(UNIX)X
-3499(Hashing)X
-3802(Techniques)X
-1 f
-2878 3470(Over)N
-3076(the)X
-3210(last)X
-3357(decade,)X
-3637(several)X
-3901(dynamic)X
-4213(hashing)X
-2706 3558(schemes)N
-3000(have)X
-3174(been)X
-3348(developed)X
-3700(for)X
-3816(the)X
-3936(UNIX)X
-4159(timeshar-)X
-2706 3646(ing)N
-2856(system,)X
-3146(starting)X
-3433(with)X
-3622(the)X
-3767(inclusion)X
-4107(of)X
-2 f
-4221(dbm)X
-1 f
-4359(,)X
-4426(a)X
-2706 3734(minimal)N
-3008(database)X
-3321(library)X
-3571(written)X
-3834(by)X
-3950(Ken)X
-4120(Thompson)X
-2706 3822([THOM90],)N
-3141(in)X
-3248(the)X
-3391(Seventh)X
-3694(Edition)X
-3974(UNIX)X
-4220(system.)X
-2706 3910(Since)N
-2916(then,)X
-3106(an)X
-3214(extended)X
-3536(version)X
-3804(of)X
-3903(the)X
-4032(same)X
-4228(library,)X
-2 f
-2706 3998(ndbm)N
-1 f
-2884(,)X
-2933(and)X
-3078(a)X
-3142(public-domain)X
-3637(clone)X
-3839(of)X
-3934(the)X
-4060(latter,)X
-2 f
-4273(sdbm)X
-1 f
-4442(,)X
-2706 4086(have)N
-2902(been)X
-3098(developed.)X
-3491(Another)X
-3797 0.1645(interface-compatible)AX
-2706 4174(library)N
-2 f
-2950(gdbm)X
-1 f
-3128(,)X
-3178(was)X
-3333(recently)X
-3622(made)X
-3826(available)X
-4145(as)X
-4241(part)X
-4395(of)X
-2706 4262(the)N
-2829(Free)X
-2997(Software)X
-3312(Foundation's)X
-3759(\(FSF\))X
-3970(software)X
-4271(distri-)X
-2706 4350(bution.)N
-2878 4464(All)N
-3017(of)X
-3121(these)X
-3323(implementations)X
-3893(are)X
-4029(based)X
-4248(on)X
-4364(the)X
-2706 4552(idea)N
-2871(of)X
-2969(revealing)X
-3299(just)X
-3445(enough)X
-3711(bits)X
-3856(of)X
-3953(a)X
-4019(hash)X
-4196(value)X
-4400(to)X
-2706 4640(locate)N
-2920(a)X
-2978(page)X
-3151(in)X
-3234(a)X
-3291(single)X
-3503(access.)X
-3770(While)X
-2 f
-3987(dbm/ndbm)X
-1 f
-4346(and)X
-2 f
-2706 4728(sdbm)N
-1 f
-2908(map)X
-3079(the)X
-3210(hash)X
-3390(value)X
-3597(directly)X
-3874(to)X
-3968(a)X
-4036(disk)X
-4201(address,)X
-2 f
-2706 4816(gdbm)N
-1 f
-2921(uses)X
-3096(the)X
-3231(hash)X
-3414(value)X
-3624(to)X
-3722(index)X
-3936(into)X
-4096(a)X
-2 f
-4168(directory)X
-1 f
-2706 4904([ENB88])N
-3020(containing)X
-3378(disk)X
-3531(addresses.)X
-2878 5018(The)N
-2 f
-3033(hsearch)X
-1 f
-3317(routines)X
-3605(in)X
-3697(System)X
-3962(V)X
-4049(are)X
-4177(designed)X
-2706 5106(to)N
-2804(provide)X
-3085(memory-resident)X
-3669(hash)X
-3852(tables.)X
-4115(Since)X
-4328(data)X
-2706 5194(access)N
-2948(does)X
-3131(not)X
-3269(require)X
-3533(disk)X
-3702(access,)X
-3964(simple)X
-4213(hashing)X
-2706 5282(schemes)N
-3010(which)X
-3238(may)X
-3408(require)X
-3667(multiple)X
-3964(probes)X
-4209(into)X
-4364(the)X
-2706 5370(table)N
-2889(are)X
-3015(used.)X
-3209(A)X
-3294(more)X
-3486(interesting)X
-3851(version)X
-4114(of)X
-2 f
-4208(hsearch)X
-1 f
-2706 5458(is)N
-2784(a)X
-2845(public)X
-3070(domain)X
-3335(library,)X
-2 f
-3594(dynahash)X
-1 f
-3901(,)X
-3945(that)X
-4089(implements)X
-2706 5546(Larson's)N
-3036(in-memory)X
-3440(adaptation)X
-3822([LAR88])X
-4164(of)X
-4279(linear)X
-2706 5634(hashing)N
-2975([LIT80].)X
-3 f
-720 5960(USENIX)N
-9 f
-1042(-)X
-3 f
-1106(Winter)X
-1371('91)X
-9 f
-1498(-)X
-3 f
-1562(Dallas,)X
-1815(TX)X
-1 f
-4424(1)X
-
-2 p
-%%Page: 2 2
-10 s 10 xH 0 xS 1 f
-3 f
-432 258(A)N
-510(New)X
-682(Hashing)X
-985(Package)X
-1290(for)X
-1413(UNIX)X
-3663(Seltzer)X
-3920(&)X
-4007(Yigit)X
-2 f
-1074 538(dbm)N
-1 f
-1232(and)X
-2 f
-1368(ndbm)X
-1 f
-604 670(The)N
-2 f
-760(dbm)X
-1 f
-928(and)X
-2 f
-1074(ndbm)X
-1 f
-1282(library)X
-1526(implementations)X
-2089(are)X
-432 758(based)N
-667(on)X
-799(the)X
-949(same)X
-1166(algorithm)X
-1529(by)X
-1661(Ken)X
-1846(Thompson)X
-432 846([THOM90,)N
-824(TOR88,)X
-1113(WAL84],)X
-1452(but)X
-1582(differ)X
-1789(in)X
-1879(their)X
-2054(pro-)X
-432 934(grammatic)N
-801(interfaces.)X
-1160(The)X
-1311(latter)X
-1502(is)X
-1581(a)X
-1643(modi\256ed)X
-1952(version)X
-432 1022(of)N
-533(the)X
-665(former)X
-918(which)X
-1148(adds)X
-1328(support)X
-1601(for)X
-1728(multiple)X
-2027(data-)X
-432 1110(bases)N
-634(to)X
-724(be)X
-828(open)X
-1011(concurrently.)X
-1484(The)X
-1636(discussion)X
-1996(of)X
-2090(the)X
-432 1198(algorithm)N
-774(that)X
-925(follows)X
-1196(is)X
-1280(applicable)X
-1640(to)X
-1732(both)X
-2 f
-1904(dbm)X
-1 f
-2072(and)X
-2 f
-432 1286(ndbm)N
-1 f
-610(.)X
-604 1400(The)N
-760(basic)X
-956(structure)X
-1268(of)X
-2 f
-1366(dbm)X
-1 f
-1535(calls)X
-1712(for)X
-1836(\256xed-sized)X
-432 1488(disk)N
-612(blocks)X
-868(\(buckets\))X
-1214(and)X
-1377(an)X
-2 f
-1499(access)X
-1 f
-1755(function)X
-2068(that)X
-432 1576(maps)N
-623(a)X
-681(key)X
-819(to)X
-902(a)X
-959(bucket.)X
-1234(The)X
-1380(interface)X
-1683(routines)X
-1962(use)X
-2090(the)X
-2 f
-432 1664(access)N
-1 f
-673(function)X
-970(to)X
-1062(obtain)X
-1292(the)X
-1420(appropriate)X
-1816(bucket)X
-2060(in)X
-2152(a)X
-432 1752(single)N
-643(disk)X
-796(access.)X
-604 1866(Within)N
-869(the)X
-2 f
-1010(access)X
-1 f
-1263(function,)X
-1593(a)X
-1672(bit-randomizing)X
-432 1954(hash)N
-610(function)X
-2 f
-8 s
-877 1929(2)N
-1 f
-10 s
-940 1954(is)N
-1024(used)X
-1202(to)X
-1294(convert)X
-1565(a)X
-1631(key)X
-1777(into)X
-1931(a)X
-1997(32-bit)X
-432 2042(hash)N
-605(value.)X
-825(Out)X
-971(of)X
-1064(these)X
-1254(32)X
-1359(bits,)X
-1519(only)X
-1686(as)X
-1778(many)X
-1981(bits)X
-2121(as)X
-432 2130(necessary)N
-773(are)X
-900(used)X
-1075(to)X
-1165(determine)X
-1514(the)X
-1639(particular)X
-1974(bucket)X
-432 2218(on)N
-533(which)X
-750(a)X
-807(key)X
-944(resides.)X
-1228(An)X
-1347(in-memory)X
-1724(bitmap)X
-1967(is)X
-2041(used)X
-432 2306(to)N
-533(determine)X
-893(how)X
-1070(many)X
-1287(bits)X
-1441(are)X
-1579(required.)X
-1905(Each)X
-2104(bit)X
-432 2394(indicates)N
-746(whether)X
-1033(its)X
-1136(associated)X
-1494(bucket)X
-1736(has)X
-1871(been)X
-2051(split)X
-432 2482(yet)N
-562(\(a)X
-657(0)X
-728(indicating)X
-1079(that)X
-1230(the)X
-1359(bucket)X
-1604(has)X
-1742(not)X
-1875(yet)X
-2004(split\).)X
-432 2570(The)N
-590(use)X
-730(of)X
-830(the)X
-961(hash)X
-1141(function)X
-1441(and)X
-1590(the)X
-1720(bitmap)X
-1974(is)X
-2059(best)X
-432 2658(described)N
-769(by)X
-878(stepping)X
-1177(through)X
-1454(database)X
-1759(creation)X
-2046(with)X
-432 2746(multiple)N
-718(invocations)X
-1107(of)X
-1194(a)X
-2 f
-1250(store)X
-1 f
-1430(operation.)X
-604 2860(Initially,)N
-906(the)X
-1033(hash)X
-1209(table)X
-1394(contains)X
-1690(a)X
-1755(single)X
-1974(bucket)X
-432 2948(\(bucket)N
-711(0\),)X
-836(the)X
-972(bit)X
-1094(map)X
-1270(contains)X
-1575(a)X
-1649(single)X
-1878(bit)X
-2000(\(bit)X
-2148(0)X
-432 3036(corresponding)N
-913(to)X
-997(bucket)X
-1233(0\),)X
-1342(and)X
-1480(0)X
-1542(bits)X
-1699(of)X
-1788(a)X
-1846(hash)X
-2014(value)X
-432 3124(are)N
-560(examined)X
-901(to)X
-992(determine)X
-1342(where)X
-1568(a)X
-1633(key)X
-1778(is)X
-1860(placed)X
-2099(\(in)X
-432 3212(bucket)N
-670(0\).)X
-801(When)X
-1017(bucket)X
-1255(0)X
-1319(is)X
-1396(full,)X
-1551(its)X
-1650(bit)X
-1758(in)X
-1844(the)X
-1966(bitmap)X
-432 3300(\(bit)N
-564(0\))X
-652(is)X
-726(set,)X
-856(and)X
-993(its)X
-1089(contents)X
-1377(are)X
-1497(split)X
-1655(between)X
-1943(buckets)X
-432 3388(0)N
-499(and)X
-641(1,)X
-727(by)X
-833(considering)X
-1233(the)X
-1357(0)X
-2 f
-7 s
-3356(th)Y
-10 s
-1 f
-1480 3388(bit)N
-1590(\(the)X
-1741(lowest)X
-1976(bit)X
-2086(not)X
-432 3476(previously)N
-800(examined\))X
-1169(of)X
-1266(the)X
-1393(hash)X
-1569(value)X
-1772(for)X
-1895(each)X
-2072(key)X
-432 3564(within)N
-668(the)X
-798(bucket.)X
-1064(Given)X
-1292(a)X
-1359(well-designed)X
-1840(hash)X
-2018(func-)X
-432 3652(tion,)N
-613(approximately)X
-1112(half)X
-1273(of)X
-1376(the)X
-1510(keys)X
-1693(will)X
-1853(have)X
-2041(hash)X
-432 3740(values)N
-666(with)X
-837(the)X
-964(0)X
-2 f
-7 s
-3708(th)Y
-10 s
-1 f
-1090 3740(bit)N
-1203(set.)X
-1341(All)X
-1471(such)X
-1646(keys)X
-1821(and)X
-1965(associ-)X
-432 3828(ated)N
-586(data)X
-740(are)X
-859(moved)X
-1097(to)X
-1179(bucket)X
-1413(1,)X
-1493(and)X
-1629(the)X
-1747(rest)X
-1883(remain)X
-2126(in)X
-432 3916(bucket)N
-666(0.)X
-604 4030(After)N
-804(this)X
-949(split,)X
-1135(the)X
-1262(\256le)X
-1393(now)X
-1560(contains)X
-1856(two)X
-2005(buck-)X
-432 4118(ets,)N
-562(and)X
-699(the)X
-818(bitmap)X
-1061(contains)X
-1349(three)X
-1530(bits:)X
-1687(the)X
-1805(0)X
-2 f
-7 s
-4086(th)Y
-10 s
-1 f
-1922 4118(bit)N
-2026(is)X
-2099(set)X
-432 4206(to)N
-525(indicate)X
-810(a)X
-876(bucket)X
-1120(0)X
-1190(split)X
-1357(when)X
-1561(no)X
-1671(bits)X
-1816(of)X
-1913(the)X
-2041(hash)X
-432 4294(value)N
-648(are)X
-789(considered,)X
-1199(and)X
-1357(two)X
-1519(more)X
-1726(unset)X
-1937(bits)X
-2094(for)X
-432 4382(buckets)N
-706(0)X
-775(and)X
-920(1.)X
-1029(The)X
-1183(placement)X
-1542(of)X
-1638(an)X
-1742(incoming)X
-2072(key)X
-432 4470(now)N
-604(requires)X
-897(examination)X
-1327(of)X
-1428(the)X
-1560(0)X
-2 f
-7 s
-4438(th)Y
-10 s
-1 f
-1691 4470(bit)N
-1809(of)X
-1910(the)X
-2041(hash)X
-432 4558(value,)N
-667(and)X
-824(the)X
-963(key)X
-1119(is)X
-1212(placed)X
-1462(either)X
-1685(in)X
-1787(bucket)X
-2041(0)X
-2121(or)X
-432 4646(bucket)N
-674(1.)X
-782(If)X
-864(either)X
-1075(bucket)X
-1317(0)X
-1385(or)X
-1480(bucket)X
-1722(1)X
-1790(\256lls)X
-1937(up,)X
-2064(it)X
-2135(is)X
-432 4734(split)N
-598(as)X
-693(before,)X
-947(its)X
-1050(bit)X
-1162(is)X
-1243(set)X
-1360(in)X
-1450(the)X
-1576(bitmap,)X
-1846(and)X
-1990(a)X
-2054(new)X
-432 4822(set)N
-541(of)X
-628(unset)X
-817(bits)X
-952(are)X
-1071(added)X
-1283(to)X
-1365(the)X
-1483(bitmap.)X
-604 4936(Each)N
-791(time)X
-959(we)X
-1079(consider)X
-1376(a)X
-1437(new)X
-1596(bit)X
-1705(\(bit)X
-1841(n\),)X
-1953(we)X
-2072(add)X
-432 5024(2)N
-2 f
-7 s
-4992(n)Y
-9 f
-509(+)X
-1 f
-540(1)X
-10 s
-595 5024(bits)N
-737(to)X
-826(the)X
-951(bitmap)X
-1199(and)X
-1341(obtain)X
-1567(2)X
-2 f
-7 s
-4992(n)Y
-9 f
-1644(+)X
-1 f
-1675(1)X
-10 s
-1729 5024(more)N
-1920(address-)X
-432 5112(able)N
-595(buckets)X
-869(in)X
-960(the)X
-1087(\256le.)X
-1258(As)X
-1376(a)X
-1441(result,)X
-1668(the)X
-1795(bitmap)X
-2045(con-)X
-432 5200(tains)N
-618(the)X
-751(previous)X
-1062(2)X
-2 f
-7 s
-5168(n)Y
-9 f
-1139(+)X
-1 f
-1170(1)X
-2 f
-10 s
-9 f
-5200(-)Y
-1 f
-1242(1)X
-1317(bits)X
-1467(\(1)X
-2 f
-9 f
-1534(+)X
-1 f
-1578(2)X
-2 f
-9 f
-(+)S
-1 f
-1662(4)X
-2 f
-9 f
-(+)S
-1 f
-1746(...)X
-2 f
-9 f
-(+)S
-1 f
-1850(2)X
-2 f
-7 s
-5168(n)Y
-10 s
-1 f
-1931 5200(\))N
-1992(which)X
-432 5288(trace)N
-649(the)X
-807(entire)X
-2 f
-1050(split)X
-1247(history)X
-1 f
-1529(of)X
-1656(the)X
-1813(addressable)X
-16 s
-432 5433 MXY
-864 0 Dl
-2 f
-8 s
-472 5488(2)N
-1 f
-9 s
-523 5513(This)N
-670(bit-randomizing)X
-1153(property)X
-1416(is)X
-1482(important)X
-1780(to)X
-1854(obtain)X
-2052(radi-)X
-432 5593(cally)N
-599(different)X
-874(hash)X
-1033(values)X
-1244(for)X
-1355(nearly)X
-1562(identical)X
-1836(keys,)X
-2012(which)X
-432 5673(in)N
-506(turn)X
-640(avoids)X
-846(clustering)X
-1148(of)X
-1226(such)X
-1376(keys)X
-1526(in)X
-1600(a)X
-1650(single)X
-1840(bucket.)X
-10 s
-2418 538(buckets.)N
-2590 652(Given)N
-2809(a)X
-2868(key)X
-3007(and)X
-3146(the)X
-3267(bitmap)X
-3512(created)X
-3768(by)X
-3871(this)X
-4009(algo-)X
-2418 740(rithm,)N
-2638(we)X
-2759(\256rst)X
-2910(examine)X
-3209(bit)X
-3320(0)X
-3386(of)X
-3479(the)X
-3603(bitmap)X
-3851(\(the)X
-4002(bit)X
-4112(to)X
-2418 828(consult)N
-2673(when)X
-2871(0)X
-2934(bits)X
-3072(of)X
-3162(the)X
-3283(hash)X
-3453(value)X
-3650(are)X
-3772(being)X
-3973(exam-)X
-2418 916(ined\).)N
-2631(If)X
-2713(it)X
-2785(is)X
-2866(set)X
-2982(\(indicating)X
-3356(that)X
-3503(the)X
-3628(bucket)X
-3869(split\),)X
-4080(we)X
-2418 1004(begin)N
-2617(considering)X
-3012(the)X
-3131(bits)X
-3267(of)X
-3355(the)X
-3473(32-bit)X
-3684(hash)X
-3851(value.)X
-4085(As)X
-2418 1092(bit)N
-2525(n)X
-2587(is)X
-2662(revealed,)X
-2977(a)X
-3035(mask)X
-3226(equal)X
-3422(to)X
-3506(2)X
-2 f
-7 s
-1060(n)Y
-9 f
-3583(+)X
-1 f
-3614(1)X
-2 f
-10 s
-9 f
-1092(-)Y
-1 f
-3686(1)X
-3748(will)X
-3894(yield)X
-4076(the)X
-2418 1180(current)N
-2675(bucket)X
-2918(address.)X
-3228(Adding)X
-3496(2)X
-2 f
-7 s
-1148(n)Y
-9 f
-3573(+)X
-1 f
-3604(1)X
-2 f
-10 s
-9 f
-1180(-)Y
-1 f
-3676(1)X
-3744(to)X
-3834(the)X
-3960(bucket)X
-2418 1268(address)N
-2701(identi\256es)X
-3035(which)X
-3272(bit)X
-3397(in)X
-3500(the)X
-3639(bitmap)X
-3902(must)X
-4098(be)X
-2418 1356(checked.)N
-2743(We)X
-2876(continue)X
-3173(revealing)X
-3493(bits)X
-3628(of)X
-3715(the)X
-3833(hash)X
-4000(value)X
-2418 1444(until)N
-2591(all)X
-2698(set)X
-2814(bits)X
-2955(in)X
-3043(the)X
-3167(bitmap)X
-3415(are)X
-3540(exhausted.)X
-3907(The)X
-4058(fol-)X
-2418 1532(lowing)N
-2682(algorithm,)X
-3055(a)X
-3133(simpli\256cation)X
-3614(of)X
-3723(the)X
-3863(algorithm)X
-2418 1620(due)N
-2565(to)X
-2658(Ken)X
-2823(Thompson)X
-3196([THOM90,)X
-3590(TOR88],)X
-3908(uses)X
-4076(the)X
-2418 1708(hash)N
-2625(value)X
-2839(and)X
-2995(the)X
-3133(bitmap)X
-3395(to)X
-3497(calculate)X
-3823(the)X
-3960(bucket)X
-2418 1796(address)N
-2679(as)X
-2766(discussed)X
-3093(above.)X
-0(Courier)xf 0 f
-1 f
-0 f
-8 s
-2418 2095(hash)N
-2608(=)X
-2684 -0.4038(calchash\(key\);)AX
-2418 2183(mask)N
-2608(=)X
-2684(0;)X
-2418 2271(while)N
-2646 -0.4018(\(isbitset\(\(hash)AX
-3254(&)X
-3330(mask\))X
-3558(+)X
-3634(mask\)\))X
-2706 2359(mask)N
-2896(=)X
-2972(\(mask)X
-3200(<<)X
-3314(1\))X
-3428(+)X
-3504(1;)X
-2418 2447(bucket)N
-2684(=)X
-2760(hash)X
-2950(&)X
-3026(mask;)X
-2 f
-10 s
-3211 2812(sdbm)N
-1 f
-2590 2944(The)N
-2 f
-2738(sdbm)X
-1 f
-2930(library)X
-3167(is)X
-3243(a)X
-3302(public-domain)X
-3791(clone)X
-3987(of)X
-4076(the)X
-2 f
-2418 3032(ndbm)N
-1 f
-2638(library,)X
-2914(developed)X
-3286(by)X
-3408(Ozan)X
-3620(Yigit)X
-3826(to)X
-3929(provide)X
-2 f
-2418 3120(ndbm)N
-1 f
-2596('s)X
-2692(functionality)X
-3139(under)X
-3359(some)X
-3565(versions)X
-3869(of)X
-3973(UNIX)X
-2418 3208(that)N
-2559(exclude)X
-2830(it)X
-2894(for)X
-3008(licensing)X
-3317(reasons)X
-3578([YIG89].)X
-3895(The)X
-4040(pro-)X
-2418 3296(grammer)N
-2735(interface,)X
-3064(and)X
-3207(the)X
-3332(basic)X
-3524(structure)X
-3832(of)X
-2 f
-3926(sdbm)X
-1 f
-4121(is)X
-2418 3384(identical)N
-2733(to)X
-2 f
-2834(ndbm)X
-1 f
-3051(but)X
-3192(internal)X
-3476(details)X
-3723(of)X
-3828(the)X
-2 f
-3964(access)X
-1 f
-2418 3472(function,)N
-2726(such)X
-2894(as)X
-2982(the)X
-3101(calculation)X
-3474(of)X
-3561(the)X
-3679(bucket)X
-3913(address,)X
-2418 3560(and)N
-2563(the)X
-2690(use)X
-2825(of)X
-2920(different)X
-3225(hash)X
-3400(functions)X
-3726(make)X
-3928(the)X
-4054(two)X
-2418 3648(incompatible)N
-2856(at)X
-2934(the)X
-3052(database)X
-3349(level.)X
-2590 3762(The)N
-2 f
-2740(sdbm)X
-1 f
-2934(library)X
-3173(is)X
-3251(based)X
-3458(on)X
-3562(a)X
-3622(simpli\256ed)X
-3965(imple-)X
-2418 3850(mentation)N
-2778(of)X
-2885(Larson's)X
-3206(1978)X
-2 f
-3406(dynamic)X
-3717(hashing)X
-1 f
-4009(algo-)X
-2418 3938(rithm)N
-2616(including)X
-2943(the)X
-2 f
-3066(re\256nements)X
-3461(and)X
-3605(variations)X
-1 f
-3953(of)X
-4044(sec-)X
-2418 4026(tion)N
-2562(5)X
-2622([LAR78].)X
-2956(Larson's)X
-3257(original)X
-3526(algorithm)X
-3857(calls)X
-4024(for)X
-4138(a)X
-2418 4114(forest)N
-2635(of)X
-2736(binary)X
-2975(hash)X
-3156(trees)X
-3341(that)X
-3494(are)X
-3626(accessed)X
-3941(by)X
-4054(two)X
-2418 4202(hash)N
-2586(functions.)X
-2925(The)X
-3071(\256rst)X
-3216(hash)X
-3384(function)X
-3672(selects)X
-3907(a)X
-3964(partic-)X
-2418 4290(ular)N
-2571(tree)X
-2720(within)X
-2952(the)X
-3078(forest.)X
-3309(The)X
-3462(second)X
-3713(hash)X
-3887(function,)X
-2418 4378(which)N
-2659(is)X
-2757(required)X
-3070(to)X
-3177(be)X
-3297(a)X
-3377(boolean)X
-3675(pseudo-random)X
-2418 4466(number)N
-2687(generator)X
-3015(that)X
-3159(is)X
-3236(seeded)X
-3479(by)X
-3583(the)X
-3705(key,)X
-3865(is)X
-3942(used)X
-4112(to)X
-2418 4554(traverse)N
-2733(the)X
-2890(tree)X
-3070(until)X
-3275(internal)X
-3579(\(split\))X
-3829(nodes)X
-4075(are)X
-2418 4642(exhausted)N
-2763(and)X
-2903(an)X
-3003(external)X
-3286(\(non-split\))X
-3648(node)X
-3827(is)X
-3903(reached.)X
-2418 4730(The)N
-2571(bucket)X
-2813(addresses)X
-3149(are)X
-3276(stored)X
-3500(directly)X
-3772(in)X
-3861(the)X
-3986(exter-)X
-2418 4818(nal)N
-2536(nodes.)X
-2590 4932(Larson's)N
-2903(re\256nements)X
-3309(are)X
-3440(based)X
-3655(on)X
-3767(the)X
-3897(observa-)X
-2418 5020(tion)N
-2570(that)X
-2718(the)X
-2844(nodes)X
-3059(can)X
-3199(be)X
-3303(represented)X
-3702(by)X
-3809(a)X
-3872(single)X
-4090(bit)X
-2418 5108(that)N
-2569(is)X
-2653(set)X
-2773(for)X
-2898(internal)X
-3174(nodes)X
-3392(and)X
-3539(not)X
-3672(set)X
-3791(for)X
-3915(external)X
-2418 5196(nodes,)N
-2652(resulting)X
-2959(in)X
-3048(a)X
-3111(radix)X
-3303(search)X
-3536(trie.)X
-3709(Figure)X
-3944(1)X
-4010(illus-)X
-2418 5284(trates)N
-2621(this.)X
-2804(Nodes)X
-3037(A)X
-3123(and)X
-3267(B)X
-3348(are)X
-3475(internal)X
-3748(\(split\))X
-3967(nodes,)X
-2418 5372(thus)N
-2573(having)X
-2813(no)X
-2915(bucket)X
-3151(addresses)X
-3480(associated)X
-3831(with)X
-3994(them.)X
-2418 5460(Instead,)N
-2693(the)X
-2814(external)X
-3096(nodes)X
-3306(\(C,)X
-3429(D,)X
-3530(and)X
-3669(E\))X
-3768(each)X
-3938(need)X
-4112(to)X
-2418 5548(refer)N
-2594(to)X
-2679(a)X
-2738(bucket)X
-2975(address.)X
-3279(These)X
-3494(bucket)X
-3731(addresses)X
-4062(can)X
-2418 5636(be)N
-2529(stored)X
-2760(in)X
-2857(the)X
-2990(trie)X
-3132(itself)X
-3327(where)X
-3559(the)X
-3691(subtries)X
-3974(would)X
-3 f
-432 5960(2)N
-2970(USENIX)X
-9 f
-3292(-)X
-3 f
-3356(Winter)X
-3621('91)X
-9 f
-3748(-)X
-3 f
-3812(Dallas,)X
-4065(TX)X
-
-3 p
-%%Page: 3 3
-0(Courier)xf 0 f
-10 s 10 xH 0 xS 0 f
-3 f
-720 258(Seltzer)N
-977(&)X
-1064(Yigit)X
-3278(A)X
-3356(New)X
-3528(Hashing)X
-3831(Package)X
-4136(for)X
-4259(UNIX)X
-1 f
-720 538(live)N
-862(if)X
-933(they)X
-1092(existed)X
-1340([KNU68].)X
-1709(For)X
-1841(example,)X
-2154(if)X
-2224(nodes)X
-2432(F)X
-720 626(and)N
-858(G)X
-938(were)X
-1117(the)X
-1237(children)X
-1522(of)X
-1610(node)X
-1787(C,)X
-1881(the)X
-2000(bucket)X
-2235(address)X
-720 714(L00)N
-886(could)X
-1101(reside)X
-1330(in)X
-1429(the)X
-1563(bits)X
-1714(that)X
-1870(will)X
-2030(eventually)X
-2400(be)X
-720 802(used)N
-887(to)X
-969(store)X
-1145(nodes)X
-1352(F)X
-1416(and)X
-1552(G)X
-1630(and)X
-1766(all)X
-1866(their)X
-2033(children.)X
-10 f
-720 890 -0.0930(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)AN
-3 f
-1894 2247(L1)N
-784 1925(A)N
-1431(E)X
-1106 2247(D)N
-1428 1281(C)N
-1109 1603(B)N
-1884 1930(L01)N
-1879 1286(L00)N
-1221 1814(1)N
-903 2131(1)N
-1221 1402(0)N
-903 1714(0)N
-1 Dt
-1397 1821 MXY
--8 -32 Dl
--5 19 Dl
--20 6 Dl
-33 7 Dl
--187 -182 Dl
-1397 1322 MXY
--33 7 Dl
-20 6 Dl
-5 19 Dl
-8 -32 Dl
--187 182 Dl
-1069 1639 MXY
--32 7 Dl
-20 6 Dl
-5 19 Dl
-7 -32 Dl
--186 182 Dl
-1374 1891 MXY
-185 Dc
-1779 2133 MXY
-0 161 Dl
-322 0 Dl
-0 -161 Dl
--322 0 Dl
-1811 MY
-0 161 Dl
-322 0 Dl
-0 -161 Dl
--322 0 Dl
-1166 MY
-0 161 Dl
-322 0 Dl
-0 -161 Dl
--322 0 Dl
-1052 2213 MXY
-185 Dc
-1569 MY
-185 Dc
-720 1881 MXY
-185 Dc
-1779 2213 MXY
--28 -17 Dl
-10 17 Dl
--10 18 Dl
-28 -18 Dl
--543 0 Dl
-1769 1891 MXY
--28 -18 Dl
-10 18 Dl
--10 18 Dl
-28 -18 Dl
--201 0 Dl
-1364 1247 MXY
-185 Dc
-1769 MX
--28 -18 Dl
-10 18 Dl
--10 18 Dl
-28 -18 Dl
--201 0 Dl
-1064 2143 MXY
--7 -32 Dl
--5 19 Dl
--20 6 Dl
-32 7 Dl
--181 -181 Dl
-3 Dt
--1 Ds
-8 s
-720 2482(Figure)N
-925(1:)X
-1 f
-1002(Radix)X
-1179(search)X
-1365(trie)X
-1474(with)X
-1612(internal)X
-1831(nodes)X
-2004(A)X
-2074(and)X
-2189(B,)X
-2271(external)X
-720 2570(nodes)N
-891(C,)X
-972(D,)X
-1056(and)X
-1170(E,)X
-1247(and)X
-1361(bucket)X
-1553(addresses)X
-1819(stored)X
-1997(in)X
-2069(the)X
-2168(unused)X
-2370(por-)X
-720 2658(tion)N
-836(of)X
-905(the)X
-999(trie.)X
-10 s
-10 f
-720 2922 -0.0930(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)AN
-1 f
-892 3124(Further)N
-1153(simpli\256cations)X
-1647(of)X
-1738(the)X
-1860(above)X
-2076([YIG89])X
-2377(are)X
-720 3212(possible.)N
-1038(Using)X
-1265(a)X
-1337(single)X
-1564(radix)X
-1765(trie)X
-1908(to)X
-2006(avoid)X
-2219(the)X
-2352(\256rst)X
-720 3300(hash)N
-904(function,)X
-1227(replacing)X
-1562(the)X
-1696(pseudo-random)X
-2231(number)X
-720 3388(generator)N
-1052(with)X
-1222(a)X
-1286(well)X
-1452(designed,)X
-1785(bit-randomizing)X
-2329(hash)X
-720 3476(function,)N
-1053(and)X
-1215(using)X
-1434(the)X
-1578(portion)X
-1855(of)X
-1967(the)X
-2110(hash)X
-2302(value)X
-720 3564(exposed)N
-1021(during)X
-1268(the)X
-1404(trie)X
-1549(traversal)X
-1864(as)X
-1969(a)X
-2042(direct)X
-2262(bucket)X
-720 3652(address)N
-990(results)X
-1228(in)X
-1319(an)X
-2 f
-1424(access)X
-1 f
-1663(function)X
-1959(that)X
-2108(works)X
-2333(very)X
-720 3740(similar)N
-974(to)X
-1068(Thompson's)X
-1499(algorithm)X
-1841(above.)X
-2084(The)X
-2240(follow-)X
-720 3828(ing)N
-847(algorithm)X
-1183(uses)X
-1346(the)X
-1469(hash)X
-1641(value)X
-1840(to)X
-1927(traverse)X
-2206(a)X
-2266(linear-)X
-720 3916(ized)N
-874(radix)X
-1059(trie)X
-2 f
-8 s
-1166 3891(3)N
-1 f
-10 s
-1218 3916(starting)N
-1478(at)X
-1556(the)X
-1674(0)X
-2 f
-7 s
-3884(th)Y
-10 s
-1 f
-1791 3916(bit.)N
-0 f
-8 s
-720 4215(tbit)N
-910(=)X
-986(0;)X
-1296(/*)X
-1410(radix)X
-1638(trie)X
-1828(index)X
-2056(*/)X
-720 4303(hbit)N
-910(=)X
-986(0;)X
-1296(/*)X
-1410(hash)X
-1600(bit)X
-1752(index)X
-2056(*/)X
-720 4391(mask)N
-910(=)X
-986(0;)X
-720 4479(hash)N
-910(=)X
-986 -0.4038(calchash\(key\);)AX
-720 4655(for)N
-872(\(mask)X
-1100(=)X
-1176(0;)X
-910 4743 -0.4018(isbitset\(tbit\);)AN
-910 4831(mask)N
-1100(=)X
-1176(\(mask)X
-1404(<<)X
-1518(1\))X
-1632(+)X
-1708(1\))X
-1008 4919(if)N
-1122(\(hash)X
-1350(&)X
-1426(\(1)X
-1540(<<)X
-1654 -0.4219(hbit++\)\)\))AX
-1160 5007(/*)N
-1274(right)X
-1502(son)X
-1692(*/)X
-1160 5095(tbit)N
-1350(=)X
-1426(2)X
-1502(*)X
-1578(tbit)X
-1768(+)X
-1844(2;)X
-1008 5183(else)N
-1 f
-16 s
-720 5353 MXY
-864 0 Dl
-2 f
-8 s
-760 5408(3)N
-1 f
-9 s
-818 5433(A)N
-896(linearized)X
-1206(radix)X
-1380(trie)X
-1502(is)X
-1576(merely)X
-1802(an)X
-1895(array)X
-2068(representation)X
-720 5513(of)N
-800(the)X
-908(radix)X
-1076(search)X
-1280(trie)X
-1396(described)X
-1692(above.)X
-1920(The)X
-2052(children)X
-2308(of)X
-2388(the)X
-720 5593(node)N
-885(with)X
-1038(index)X
-1223(i)X
-1267(can)X
-1391(be)X
-1483(found)X
-1675(at)X
-1751(the)X
-1863(nodes)X
-2055(indexed)X
-2307(2*i+1)X
-720 5673(and)N
-842(2*i+2.)X
-0 f
-8 s
-3146 538(/*)N
-3260(left)X
-3450(son)X
-3678(*/)X
-3146 626(tbit)N
-3336(=)X
-3412(2)X
-3488(*)X
-3564(tbit)X
-3754(+)X
-3830(1;)X
-2706 802(bucket)N
-2972(=)X
-3048(hash)X
-3238(&)X
-3314(mask;)X
-2 f
-10 s
-3495 1167(gdbm)N
-1 f
-2878 1299(The)N
-3027(gdbm)X
-3233(\(GNU)X
-3458(data)X
-3616(base)X
-3783(manager\))X
-4111(library)X
-4349(is)X
-4426(a)X
-2706 1387(UNIX)N
-2933(database)X
-3236(manager)X
-3539(written)X
-3792(by)X
-3897(Philip)X
-4112(A.)X
-4215(Nelson,)X
-2706 1475(and)N
-2848(made)X
-3048(available)X
-3364(as)X
-3457(a)X
-3518(part)X
-3668(of)X
-3760(the)X
-3883(FSF)X
-4040(software)X
-4342(dis-)X
-2706 1563(tribution.)N
-3052(The)X
-3207(gdbm)X
-3419(library)X
-3663(provides)X
-3969(the)X
-4097(same)X
-4292(func-)X
-2706 1651(tionality)N
-3028(of)X
-3151(the)X
-2 f
-3304(dbm)X
-1 f
-3442(/)X
-2 f
-3464(ndbm)X
-1 f
-3697(libraries)X
-4015([NEL90])X
-4360(but)X
-2706 1739(attempts)N
-3018(to)X
-3121(avoid)X
-3340(some)X
-3550(of)X
-3658(their)X
-3846(shortcomings.)X
-4337(The)X
-2706 1827(gdbm)N
-2918(library)X
-3162(allows)X
-3401(for)X
-3525(arbitrary-length)X
-4059(data,)X
-4242(and)X
-4387(its)X
-2706 1915(database)N
-3027(is)X
-3124(a)X
-3203(singular,)X
-3524(non-sparse)X
-2 f
-8 s
-3872 1890(4)N
-1 f
-10 s
-3947 1915(\256le.)N
-4112(The)X
-4280(gdbm)X
-2706 2003(library)N
-2947(also)X
-3103(includes)X
-2 f
-3396(dbm)X
-1 f
-3560(and)X
-2 f
-3702(ndbm)X
-1 f
-3906(compatible)X
-4288(inter-)X
-2706 2091(faces.)N
-2878 2205(The)N
-3025(gdbm)X
-3229(library)X
-3465(is)X
-3540(based)X
-3745(on)X
-2 f
-3847(extensible)X
-4189(hashing)X
-1 f
-4442(,)X
-2706 2293(a)N
-2766(dynamic)X
-3066(hashing)X
-3339(algorithm)X
-3674(by)X
-3778(Fagin)X
-3984(et)X
-4066(al)X
-4148([FAG79].)X
-2706 2381(This)N
-2881(algorithm)X
-3225(differs)X
-3467(from)X
-3655(the)X
-3785(previously)X
-4155(discussed)X
-2706 2469(algorithms)N
-3069(in)X
-3152(that)X
-3293(it)X
-3358(uses)X
-3517(a)X
-2 f
-3574(directory)X
-1 f
-3889(that)X
-4030(is)X
-4103(a)X
-4159(collapsed)X
-2706 2557(representation)N
-3192([ENB88])X
-3517(of)X
-3615(the)X
-3744(radix)X
-3940(search)X
-4177(trie)X
-4315(used)X
-2706 2645(by)N
-2 f
-2806(sdbm)X
-1 f
-2975(.)X
-10 f
-2706 2733 -0.0930(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)AN
-3 f
-7 s
-3572 3761(L1)N
-1 Dt
-3485 3738 MXY
--20 -13 Dl
-7 13 Dl
--7 13 Dl
-20 -13 Dl
--400 0 Dl
-3180 3027 MXY
-136 Dc
-2706 3494 MXY
-136 Dc
-2950 3264 MXY
-136 Dc
-3738 MY
-136 Dc
-3485 2968 MXY
-0 118 Dl
-238 0 Dl
-0 -118 Dl
--238 0 Dl
-3442 MY
-0 119 Dl
-238 0 Dl
-0 -119 Dl
--238 0 Dl
-3679 MY
-0 119 Dl
-238 0 Dl
-0 -119 Dl
--238 0 Dl
-3187 3501 MXY
-136 Dc
-2963 3316 MXY
--24 5 Dl
-15 4 Dl
-4 15 Dl
-5 -24 Dl
--137 134 Dl
-3204 3083 MXY
--24 5 Dl
-15 4 Dl
-3 14 Dl
-6 -23 Dl
--137 133 Dl
-3204 3450 MXY
--6 -24 Dl
--3 14 Dl
--15 5 Dl
-24 5 Dl
--137 -134 Dl
-2842 3369(0)N
-3075 3139(0)N
-2842 3676(1)N
-3075 3443(1)N
-3562 3054(L00)N
-3565 3528(L01)N
-4197 2968 MXY
-0 118 Dl
-237 0 Dl
-0 -118 Dl
--237 0 Dl
-3205 MY
-0 119 Dl
-237 0 Dl
-0 -119 Dl
--237 0 Dl
-3561 MY
-0 118 Dl
-237 0 Dl
-0 -118 Dl
--237 0 Dl
-3960 2909 MXY
-0 237 Dl
-118 0 Dl
-0 -237 Dl
--118 0 Dl
-3146 MY
-0 237 Dl
-118 0 Dl
-0 -237 Dl
--118 0 Dl
-3383 MY
-0 237 Dl
-118 0 Dl
-0 -237 Dl
--118 0 Dl
-3620 MY
-0 237 Dl
-118 0 Dl
-0 -237 Dl
--118 0 Dl
-4197 3027 MXY
--21 -13 Dl
-8 13 Dl
--8 13 Dl
-21 -13 Dl
--119 0 Dl
-4197 3264 MXY
--21 -13 Dl
-8 13 Dl
--8 13 Dl
-21 -13 Dl
--119 0 Dl
-3501 MY
-59 0 Dl
-0 89 Dl
-4078 3738 MXY
-59 0 Dl
-0 -88 Dl
-4197 3590 MXY
--21 -13 Dl
-8 13 Dl
--8 13 Dl
-21 -13 Dl
--60 0 Dl
-4197 3650 MXY
--21 -13 Dl
-8 13 Dl
--8 13 Dl
-21 -13 Dl
--60 0 Dl
-3991 3050(00)N
-3991 3287(01)N
-3991 3524(10)N
-3991 3761(11)N
-4269 3050(L00)N
-4269 3287(L01)N
-4283 3643(L1)N
-3485 3501 MXY
--20 -13 Dl
-7 13 Dl
--7 13 Dl
-20 -13 Dl
--155 0 Dl
-3485 3027 MXY
--20 -13 Dl
-7 13 Dl
--7 13 Dl
-20 -13 Dl
--163 0 Dl
-2967 3687 MXY
--5 -24 Dl
--4 14 Dl
--15 4 Dl
-24 6 Dl
--141 -141 Dl
-3 Dt
--1 Ds
-8 s
-2706 4033(Figure)N
-2903(2:)X
-1 f
-2972(A)X
-3034(radix)X
-3181(search)X
-3359(trie)X
-3460(and)X
-3568(a)X
-3612(directory)X
-3858(representing)X
-4189(the)X
-4283(trie.)X
-10 s
-10 f
-2706 4209 -0.0930(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)AN
-1 f
-2878 4411(In)N
-2968(this)X
-3106(algorithm,)X
-3460(a)X
-3519(directory)X
-3832(consists)X
-4108(of)X
-4198(a)X
-4256(search)X
-2706 4499(trie)N
-2847(of)X
-2947(depth)X
-2 f
-3158(n)X
-1 f
-3211(,)X
-3264(containing)X
-3635(2)X
-2 f
-7 s
-4467(n)Y
-10 s
-1 f
-3749 4499(bucket)N
-3996(addresses)X
-4337(\(i.e.)X
-2706 4587(each)N
-2897(element)X
-3194(of)X
-3304(the)X
-3445(trie)X
-3594(is)X
-3689(a)X
-3767(bucket)X
-4023(address\).)X
-4373(To)X
-2706 4675(access)N
-2935(the)X
-3056(hash)X
-3226(table,)X
-3425(a)X
-3483(32-bit)X
-3696(hash)X
-3865(value)X
-4061(is)X
-4136(calculated)X
-2706 4763(and)N
-2 f
-2861(n)X
-1 f
-2953(bits)X
-3107(of)X
-3213(the)X
-3350(value)X
-3563(are)X
-3701(used)X
-3886(to)X
-3986(index)X
-4202(into)X
-4364(the)X
-2706 4851(directory)N
-3018(to)X
-3102(obtain)X
-3324(a)X
-3382(bucket)X
-3618(address.)X
-3921(It)X
-3992(is)X
-4067(important)X
-4400(to)X
-2706 4939(note)N
-2866(that)X
-3008(multiple)X
-3296(entries)X
-3532(of)X
-3620(this)X
-3756(directory)X
-4067(may)X
-4226(contain)X
-2706 5027(the)N
-2833(same)X
-3026(bucket)X
-3268(address)X
-3537(as)X
-3632(a)X
-3696(result)X
-3902(of)X
-3997(directory)X
-4315(dou-)X
-2706 5115(bling)N
-2903(during)X
-3145(bucket)X
-3392(splitting.)X
-3706(Figure)X
-3948(2)X
-4021(illustrates)X
-4364(the)X
-2706 5203(relationship)N
-3126(between)X
-3436(a)X
-3513(typical)X
-3772(\(skewed\))X
-4108(search)X
-4355(trie)X
-2706 5291(and)N
-2850(its)X
-2953(directory)X
-3271(representation.)X
-3774(The)X
-3927(formation)X
-4270(of)X
-4364(the)X
-2706 5379(directory)N
-3016(shown)X
-3245(in)X
-3327(the)X
-3445(\256gure)X
-3652(is)X
-3725(as)X
-3812(follows.)X
-16 s
-2706 5593 MXY
-864 0 Dl
-2 f
-8 s
-2746 5648(4)N
-1 f
-9 s
-2796 5673(It)N
-2858(does)X
-3008(not)X
-3118(contain)X
-3348(holes.)X
-3 f
-10 s
-720 5960(USENIX)N
-9 f
-1042(-)X
-3 f
-1106(Winter)X
-1371('91)X
-9 f
-1498(-)X
-3 f
-1562(Dallas,)X
-1815(TX)X
-4424(3)X
-
-4 p
-%%Page: 4 4
-0(Courier)xf 0 f
-10 s 10 xH 0 xS 0 f
-3 f
-432 258(A)N
-510(New)X
-682(Hashing)X
-985(Package)X
-1290(for)X
-1413(UNIX)X
-3663(Seltzer)X
-3920(&)X
-4007(Yigit)X
-1 f
-604 538(Initially,)N
-937(there)X
-1158(is)X
-1271(one)X
-1446(slot)X
-1620(in)X
-1741(the)X
-1898(directory)X
-432 626(addressing)N
-802(a)X
-865(single)X
-1083(bucket.)X
-1364(The)X
-1515(depth)X
-1719(of)X
-1812(the)X
-1936(trie)X
-2069(is)X
-2148(0)X
-432 714(and)N
-577(0)X
-646(bits)X
-790(of)X
-886(each)X
-1063(hash)X
-1239(value)X
-1442(are)X
-1570(examined)X
-1910(to)X
-2000(deter-)X
-432 802(mine)N
-624(in)X
-718(which)X
-946(bucket)X
-1192(to)X
-1286(place)X
-1488(a)X
-1556(key;)X
-1726(all)X
-1837(keys)X
-2015(go)X
-2126(in)X
-432 890(bucket)N
-682(0.)X
-797(When)X
-1024(this)X
-1174(bucket)X
-1423(is)X
-1511(full,)X
-1677(its)X
-1787(contents)X
-2089(are)X
-432 978(divided)N
-698(between)X
-992(L0)X
-1107(and)X
-1249(L1)X
-1363(as)X
-1455(was)X
-1605(done)X
-1786(in)X
-1873(the)X
-1996(previ-)X
-432 1066(ously)N
-664(discussed)X
-1030(algorithms.)X
-1471(After)X
-1700(this)X
-1874(split,)X
-2090(the)X
-432 1154(address)N
-710(of)X
-814(the)X
-948(second)X
-1207(bucket)X
-1457(must)X
-1648(be)X
-1760(stored)X
-1992(in)X
-2090(the)X
-432 1242(directory.)N
-796(To)X
-939(accommodate)X
-1438(the)X
-1589(new)X
-1776(address,)X
-2090(the)X
-432 1330(directory)N
-752(is)X
-835(split)X
-2 f
-8 s
-972 1305(5)N
-1 f
-10 s
-1330(,)Y
-1054(by)X
-1163(doubling)X
-1476(it,)X
-1569(thus)X
-1731(increasing)X
-2090(the)X
-432 1418(depth)N
-630(of)X
-717(the)X
-835(directory)X
-1145(by)X
-1245(one.)X
-604 1532(After)N
-813(this)X
-967(split,)X
-1163(a)X
-1237(single)X
-1466(bit)X
-1588(of)X
-1693(the)X
-1829(hash)X
-2014(value)X
-432 1620(needs)N
-663(to)X
-773(be)X
-896(examined)X
-1255(to)X
-1364(decide)X
-1621(whether)X
-1927(the)X
-2072(key)X
-432 1708(belongs)N
-711(to)X
-803(L0)X
-922(or)X
-1019(L1.)X
-1158(Once)X
-1358(one)X
-1504(of)X
-1601(these)X
-1795(buckets)X
-2069(\256lls)X
-432 1796(\(L0)N
-578(for)X
-702(example\),)X
-1051(it)X
-1125(is)X
-1208(split)X
-1375(as)X
-1472(before,)X
-1728(and)X
-1873(the)X
-2000(direc-)X
-432 1884(tory)N
-585(is)X
-662(split)X
-823(again)X
-1021(to)X
-1107(make)X
-1305(room)X
-1498(for)X
-1615(the)X
-1736(address)X
-2000(of)X
-2090(the)X
-432 1972(third)N
-618(bucket.)X
-927(This)X
-1104(splitting)X
-1400(causes)X
-1645(the)X
-1778(addresses)X
-2121(of)X
-432 2060(the)N
-567(non-splitting)X
-1012(bucket)X
-1263(\(L1\))X
-1443(to)X
-1541(be)X
-1653(duplicated.)X
-2063(The)X
-432 2148(directory)N
-766(now)X
-948(has)X
-1099(four)X
-1277(entries,)X
-1555(a)X
-1635(depth)X
-1857(of)X
-1968(2,)X
-2072(and)X
-432 2236(indexes)N
-700(the)X
-821(buckets)X
-1089(L00,)X
-1261(L01)X
-1413(and)X
-1552(L1,)X
-1684(as)X
-1774(shown)X
-2006(in)X
-2090(the)X
-432 2324(Figure)N
-661(2.)X
-604 2438(The)N
-756(crucial)X
-1002(part)X
-1154(of)X
-1247(the)X
-1371(algorithm)X
-1708(is)X
-1787(the)X
-1911(observa-)X
-432 2526(tion)N
-580(that)X
-724(L1)X
-837(is)X
-914(addressed)X
-1255(twice)X
-1453(in)X
-1539(the)X
-1661(directory.)X
-1995(If)X
-2073(this)X
-432 2614(bucket)N
-679(were)X
-869(to)X
-964(split)X
-1134(now,)X
-1324(the)X
-1454(directory)X
-1776(already)X
-2045(con-)X
-432 2702(tains)N
-611(room)X
-808(to)X
-898(hold)X
-1067(the)X
-1192(address)X
-1460(of)X
-1554(the)X
-1679(new)X
-1840(bucket.)X
-2121(In)X
-432 2790(general,)N
-711(the)X
-831(relationship)X
-1231(between)X
-1521(the)X
-1641(directory)X
-1953(and)X
-2090(the)X
-432 2878(number)N
-704(of)X
-798(bucket)X
-1039(addresses)X
-1374(contained)X
-1713(therein)X
-1962(is)X
-2041(used)X
-432 2966(to)N
-517(decide)X
-750(when)X
-947(to)X
-1031(split)X
-1190(the)X
-1310(directory.)X
-1662(Each)X
-1845(bucket)X
-2081(has)X
-432 3054(a)N
-505(depth,)X
-740(\()X
-2 f
-767(n)X
-7 s
-3070(b)Y
-10 s
-1 f
-848 3054(\),)N
-932(associated)X
-1299(with)X
-1478(it)X
-1558(and)X
-1710(appears)X
-1992(in)X
-2090(the)X
-432 3142(directory)N
-744(exactly)X
-998(2)X
-2 f
-7 s
-3106(n)Y
-9 f
-1075(-)X
-2 f
-1106(n)X
-4 s
-3110(b)Y
-7 s
-1 f
-10 s
-1181 3142(times.)N
-1396(When)X
-1610(a)X
-1668(bucket)X
-1904(splits,)X
-2113(its)X
-432 3230(depth)N
-638(increases)X
-961(by)X
-1069(one.)X
-1253(The)X
-1406(directory)X
-1724(must)X
-1907(split)X
-2072(any)X
-432 3318(time)N
-602(a)X
-665(bucket's)X
-964(depth)X
-1169(exceeds)X
-1451(the)X
-1576(depth)X
-1781(of)X
-1875(the)X
-2000(direc-)X
-432 3406(tory.)N
-630(The)X
-784(following)X
-1123(code)X
-1303(fragment)X
-1621(helps)X
-1818(to)X
-1908(illustrate)X
-432 3494(the)N
-554(extendible)X
-912(hashing)X
-1185(algorithm)X
-1520([FAG79])X
-1838(for)X
-1955(access-)X
-432 3582(ing)N
-554(individual)X
-898(buckets)X
-1163(and)X
-1299(maintaining)X
-1701(the)X
-1819(directory.)X
-0 f
-8 s
-432 3881(hash)N
-622(=)X
-698 -0.4038(calchash\(key\);)AX
-432 3969(mask)N
-622(=)X
-698 -0.4018(maskvec[depth];)AX
-432 4145(bucket)N
-698(=)X
-774 -0.4038(directory[hash)AX
-1344(&)X
-1420(mask];)X
-432 4321(/*)N
-546(Key)X
-698 -0.4219(Insertion)AX
-1078(*/)X
-432 4409(if)N
-546 -0.4038(\(store\(bucket,)AX
-1116(key,)X
-1306(data\))X
-1534(==)X
-1648(FAIL\))X
-1876({)X
-720 4497(newbl)N
-948(=)X
-1024 -0.4167(getpage\(\);)AX
-720 4585 -0.4000(bucket->depth++;)AN
-720 4673 -0.4091(newbl->depth)AN
-1214(=)X
-1290 -0.4038(bucket->depth;)AX
-720 4761(if)N
-834 -0.4038(\(bucket->depth)AX
-1404(>)X
-1480(depth\))X
-1746({)X
-1008 4849(/*)N
-1122(double)X
-1388 -0.4219(directory)AX
-1768(*/)X
-1008 4937(depth++;)N
-1 f
-16 s
-432 5033 MXY
-864 0 Dl
-2 f
-8 s
-472 5088(5)N
-1 f
-9 s
-534 5113(This)N
-692(decision)X
-962(to)X
-1048(split)X
-1202(the)X
-1319(directory)X
-1608(is)X
-1685(based)X
-1878(on)X
-1979(a)X
-2040(com-)X
-432 5193(parison)N
-666(of)X
-748(the)X
-858(depth)X
-1040(of)X
-1121(the)X
-1230(page)X
-1387(being)X
-1568(split)X
-1713(and)X
-1838(the)X
-1947(depth)X
-2128(of)X
-432 5273(the)N
-543(trie.)X
-698(In)X
-781(Figure)X
-992(2,)X
-1069(the)X
-1180(depths)X
-1390(of)X
-1472(both)X
-1622(L00)X
-1760(and)X
-1886(L01)X
-2024(are)X
-2134(2,)X
-432 5353(whereas)N
-689(the)X
-798(depth)X
-979(of)X
-1060(L1)X
-1161(is)X
-1230(1.)X
-1323(Therefore,)X
-1646(if)X
-1710(L1)X
-1810(were)X
-1970(to)X
-2046(split,)X
-432 5433(the)N
-543(directory)X
-826(would)X
-1029(not)X
-1144(need)X
-1303(to)X
-1382(split.)X
-1565(In)X
-1648(reality,)X
-1872(a)X
-1926(bucket)X
-2140(is)X
-432 5513(allocated)N
-727(for)X
-846(the)X
-969(directory)X
-1264(at)X
-1351(the)X
-1474(time)X
-1637(of)X
-1732(\256le)X
-1858(creation)X
-2124(so)X
-432 5593(although)N
-707(the)X
-818(directory)X
-1100(splits)X
-1274(logically,)X
-1566(physical)X
-1828(splits)X
-2002(do)X
-2096(not)X
-432 5673(occur)N
-610(until)X
-760(the)X
-866(\256le)X
-976(becomes)X
-1246(quite)X
-1408(large.)X
-0 f
-8 s
-2994 538 -0.4219(directory)AN
-3374(=)X
-3450 -0.3971(double\(directory\);)AX
-2706 626(})N
-2706 714 -0.3958(splitbucket\(bucket,)AN
-3466(newbl\))X
-2706 802(...)N
-2418 890(})N
-2 f
-10 s
-3169 1255(hsearch)N
-1 f
-2590 1387(Since)N
-2 f
-2807(hsearch)X
-1 f
-3100(does)X
-3286(not)X
-3427(have)X
-3617(to)X
-3717(translate)X
-4027(hash)X
-2418 1475(values)N
-2659(into)X
-2819(disk)X
-2988(addresses,)X
-3352(it)X
-3432(can)X
-3579(use)X
-3721(much)X
-3934(simpler)X
-2418 1563(algorithms)N
-2808(than)X
-2994(those)X
-3211(de\256ned)X
-3495(above.)X
-3775(System)X
-4058(V's)X
-2 f
-2418 1651(hsearch)N
-1 f
-2708(constructs)X
-3069(a)X
-3141(\256xed-size)X
-3489(hash)X
-3671(table)X
-3862(\(speci\256ed)X
-2418 1739(by)N
-2519(the)X
-2637(user)X
-2791(at)X
-2869(table)X
-3045(creation\).)X
-3391(By)X
-3504(default,)X
-3767(a)X
-3823(multiplica-)X
-2418 1827(tive)N
-2570(hash)X
-2748(function)X
-3046(based)X
-3260(on)X
-3371(that)X
-3522(described)X
-3861(in)X
-3954(Knuth,)X
-2418 1915(Volume)N
-2710(3,)X
-2804(section)X
-3065(6.4)X
-3199([KNU68])X
-3541(is)X
-3628(used)X
-3809(to)X
-3905(obtain)X
-4138(a)X
-2418 2003(primary)N
-2694(bucket)X
-2930(address.)X
-3233(If)X
-3309(this)X
-3446(bucket)X
-3681(is)X
-3755(full,)X
-3907(a)X
-3964(secon-)X
-2418 2091(dary)N
-2593(multiplicative)X
-3069(hash)X
-3248(value)X
-3454(is)X
-3538(computed)X
-3885(to)X
-3978(de\256ne)X
-2418 2179(the)N
-2542(probe)X
-2751(interval.)X
-3062(The)X
-3213(probe)X
-3422(interval)X
-3693(is)X
-3772(added)X
-3989(to)X
-4076(the)X
-2418 2267(original)N
-2712(bucket)X
-2971(address)X
-3257(\(modulo)X
-3573(the)X
-3716(table)X
-3916(size\))X
-4112(to)X
-2418 2355(obtain)N
-2658(a)X
-2734(new)X
-2908(bucket)X
-3162(address.)X
-3483(This)X
-3665(process)X
-3946(repeats)X
-2418 2443(until)N
-2588(an)X
-2688(empty)X
-2911(bucket)X
-3148(is)X
-3224(found.)X
-3474(If)X
-3551(no)X
-3654(bucket)X
-3891(is)X
-3967(found,)X
-2418 2531(an)N
-2514(insertion)X
-2814(fails)X
-2972(with)X
-3134(a)X
-3190(``table)X
-3420(full'')X
-3605(condition.)X
-2590 2645(The)N
-2768(basic)X
-2986(algorithm)X
-3350(may)X
-3541(be)X
-3670(modi\256ed)X
-4006(by)X
-4138(a)X
-2418 2733(number)N
-2705(of)X
-2813(compile)X
-3112(time)X
-3295(options)X
-3571(available)X
-3902(to)X
-4005(those)X
-2418 2821(users)N
-2604(with)X
-2767(AT&T)X
-3006(source)X
-3237(code.)X
-3450(First,)X
-3637(the)X
-3756(package)X
-4040(pro-)X
-2418 2909(vides)N
-2638(two)X
-2809(options)X
-3094(for)X
-3238(hash)X
-3435(functions.)X
-3803(Users)X
-4036(may)X
-2418 2997(specify)N
-2690(their)X
-2877(own)X
-3055(hash)X
-3242(function)X
-3549(by)X
-3669(compiling)X
-4032(with)X
-2418 3085(``USCR'')N
-2757(de\256ned)X
-3016(and)X
-3155(declaring)X
-3477(and)X
-3616(de\256ning)X
-3901(the)X
-4022(vari-)X
-2418 3173(able)N
-2 f
-2578(hcompar)X
-1 f
-2863(,)X
-2909(a)X
-2971(function)X
-3263(taking)X
-3488(two)X
-3633(string)X
-3840(arguments)X
-2418 3261(and)N
-2560(returning)X
-2880(an)X
-2982(integer.)X
-3271(Users)X
-3480(may)X
-3643(also)X
-3797(request)X
-4054(that)X
-2418 3349(hash)N
-2587(values)X
-2814(be)X
-2912(computed)X
-3250(simply)X
-3489(by)X
-3590(taking)X
-3811(the)X
-3930(modulo)X
-2418 3437(of)N
-2521(key)X
-2673(\(using)X
-2909(division)X
-3201(rather)X
-3424(than)X
-3597(multiplication)X
-4080(for)X
-2418 3525(hash)N
-2589(value)X
-2787(calculation\).)X
-3230(If)X
-3308(this)X
-3447(technique)X
-3783(is)X
-3859(used,)X
-4049(col-)X
-2418 3613(lisions)N
-2651(are)X
-2775(resolved)X
-3072(by)X
-3176(scanning)X
-3485(sequentially)X
-3896(from)X
-4076(the)X
-2418 3701(selected)N
-2702(bucket)X
-2941(\(linear)X
-3176(probing\).)X
-3517(This)X
-3684(option)X
-3913(is)X
-3991(avail-)X
-2418 3789(able)N
-2572(by)X
-2672(de\256ning)X
-2954(the)X
-3072(variable)X
-3351(``DIV'')X
-3622(at)X
-3700(compile)X
-3978(time.)X
-2590 3903(A)N
-2720(second)X
-3015(option,)X
-3311(based)X
-3565(on)X
-3716(an)X
-3863(algorithm)X
-2418 3991(discovered)N
-2787(by)X
-2888(Richard)X
-3163(P.)X
-3248(Brent,)X
-3466(rearranges)X
-3822(the)X
-3940(table)X
-4116(at)X
-2418 4079(the)N
-2549(time)X
-2724(of)X
-2824(insertion)X
-3137(in)X
-3232(order)X
-3434(to)X
-3528(speed)X
-3743(up)X
-3855(retrievals.)X
-2418 4167(The)N
-2571(basic)X
-2764(idea)X
-2926(is)X
-3007(to)X
-3097(shorten)X
-3361(long)X
-3531(probe)X
-3741(sequences)X
-4094(by)X
-2418 4255(lengthening)N
-2833(short)X
-3030(probe)X
-3249(sequences.)X
-3651(Once)X
-3857(the)X
-3991(probe)X
-2418 4343(chain)N
-2613(has)X
-2741(exceeded)X
-3062(some)X
-3252(threshold)X
-3571(\(Brent)X
-3796(suggests)X
-4087(2\),)X
-2418 4431(we)N
-2541(attempt)X
-2809(to)X
-2899(shuf\257e)X
-3145(any)X
-3289(colliding)X
-3601(keys)X
-3776(\(keys)X
-3978(which)X
-2418 4519(appeared)N
-2734(in)X
-2821(the)X
-2944(probe)X
-3152(sequence)X
-3471(of)X
-3562(the)X
-3684(new)X
-3842(key\).)X
-4049(The)X
-2418 4607(details)N
-2652(of)X
-2744(this)X
-2884(key)X
-3025(shuf\257ing)X
-3333(can)X
-3469(be)X
-3569(found)X
-3780(in)X
-3866([KNU68])X
-2418 4695(and)N
-2576([BRE73].)X
-2946(This)X
-3129(algorithm)X
-3481(may)X
-3660(be)X
-3777(obtained)X
-4094(by)X
-2418 4783(de\256ning)N
-2700(the)X
-2818(variable)X
-3097(``BRENT'')X
-3487(at)X
-3565(compile)X
-3843(time.)X
-2590 4897(A)N
-2698(third)X
-2899(set)X
-3038(of)X
-3154(options,)X
-3458(obtained)X
-3783(by)X
-3912(de\256ning)X
-2418 4985(``CHAINED'',)N
-2943(use)X
-3086(linked)X
-3321(lists)X
-3484(to)X
-3581(resolve)X
-3848(collisions.)X
-2418 5073(Either)N
-2647(of)X
-2747(the)X
-2878(primary)X
-3164(hash)X
-3343(function)X
-3642(described)X
-3982(above)X
-2418 5161(may)N
-2584(be)X
-2688(used,)X
-2882(but)X
-3011(all)X
-3118(collisions)X
-3451(are)X
-3577(resolved)X
-3876(by)X
-3983(build-)X
-2418 5249(ing)N
-2554(a)X
-2623(linked)X
-2856(list)X
-2986(of)X
-3086(entries)X
-3333(from)X
-3522(the)X
-3653(primary)X
-3940(bucket.)X
-2418 5337(By)N
-2542(default,)X
-2816(new)X
-2981(entries)X
-3226(will)X
-3381(be)X
-3488(added)X
-3711(to)X
-3804(a)X
-3871(bucket)X
-4116(at)X
-2418 5425(the)N
-2541(beginning)X
-2886(of)X
-2978(the)X
-3101(bucket)X
-3339(chain.)X
-3577(However,)X
-3916(compile)X
-2418 5513(options)N
-2706(``SORTUP'')X
-3173(or)X
-3293(``SORTDOWN'')X
-3908(may)X
-4098(be)X
-2418 5601(speci\256ed)N
-2723(to)X
-2805(order)X
-2995(the)X
-3113(hash)X
-3280(chains)X
-3505(within)X
-3729(each)X
-3897(bucket.)X
-3 f
-432 5960(4)N
-2970(USENIX)X
-9 f
-3292(-)X
-3 f
-3356(Winter)X
-3621('91)X
-9 f
-3748(-)X
-3 f
-3812(Dallas,)X
-4065(TX)X
-
-5 p
-%%Page: 5 5
-0(Courier)xf 0 f
-10 s 10 xH 0 xS 0 f
-3 f
-720 258(Seltzer)N
-977(&)X
-1064(Yigit)X
-3278(A)X
-3356(New)X
-3528(Hashing)X
-3831(Package)X
-4136(for)X
-4259(UNIX)X
-2 f
-1444 538(dynahash)N
-1 f
-892 670(The)N
-2 f
-1054(dynahash)X
-1 f
-1398(library,)X
-1669(written)X
-1932(by)X
-2048(Esmond)X
-2346(Pitt,)X
-720 758(implements)N
-1183(Larson's)X
-1554(linear)X
-1827(hashing)X
-2165(algorithm)X
-720 846([LAR88])N
-1097(with)X
-1302(an)X
-2 f
-1440(hsearch)X
-1 f
-1756(compatible)X
-2174(interface.)X
-720 934(Intuitively,)N
-1099(a)X
-1161(hash)X
-1334(table)X
-1516(begins)X
-1751(as)X
-1844(a)X
-1905(single)X
-2121(bucket)X
-2360(and)X
-720 1022(grows)N
-941(in)X
-1028(generations,)X
-1443(where)X
-1665(a)X
-1725(generation)X
-2088(corresponds)X
-720 1110(to)N
-815(a)X
-884(doubling)X
-1201(in)X
-1296(the)X
-1427(size)X
-1585(of)X
-1685(the)X
-1815(hash)X
-1994(table.)X
-2222(The)X
-2379(0)X
-2 f
-7 s
-1078(th)Y
-10 s
-1 f
-720 1198(generation)N
-1085(occurs)X
-1321(as)X
-1414(the)X
-1538(table)X
-1719(grows)X
-1940(from)X
-2121(one)X
-2262(bucket)X
-720 1286(to)N
-814(two.)X
-1006(In)X
-1105(the)X
-1235(next)X
-1405(generation)X
-1776(the)X
-1906(table)X
-2093(grows)X
-2320(from)X
-720 1374(two)N
-862(to)X
-946(four.)X
-1122(During)X
-1371(each)X
-1541(generation,)X
-1921(every)X
-2121(bucket)X
-2356(that)X
-720 1462(existed)N
-967(at)X
-1045(the)X
-1163(beginning)X
-1503(of)X
-1590(the)X
-1708(generation)X
-2067(is)X
-2140(split.)X
-892 1576(The)N
-1041(table)X
-1221(starts)X
-1414(as)X
-1505(a)X
-1565(single)X
-1780(bucket)X
-2018(\(numbered)X
-2389(0\),)X
-720 1664(the)N
-839(current)X
-1088(split)X
-1245(bucket)X
-1479(is)X
-1552(set)X
-1661(to)X
-1743(bucket)X
-1977(0,)X
-2057(and)X
-2193(the)X
-2311(max-)X
-720 1752(imum)N
-933(split)X
-1097(point)X
-1288(is)X
-1368(set)X
-1483(to)X
-1571(twice)X
-1771(the)X
-1895(current)X
-2149(split)X
-2312(point)X
-720 1840(\(0\).)N
-863(When)X
-1084(it)X
-1157(is)X
-1239(time)X
-1410(for)X
-1532(a)X
-1596(bucket)X
-1838(to)X
-1928(split,)X
-2113(the)X
-2239(keys)X
-2414(in)X
-720 1928(the)N
-872(current)X
-1154(split)X
-1345(bucket)X
-1612(are)X
-1764(divided)X
-2057(between)X
-2378(the)X
-720 2016(current)N
-981(split)X
-1151(bucket)X
-1397(and)X
-1545(a)X
-1613(new)X
-1779(bucket)X
-2025(whose)X
-2262(bucket)X
-720 2104(number)N
-1000(is)X
-1088(equal)X
-1297(to)X
-1394(1)X
-1469(+)X
-1549(current)X
-1812(split)X
-1984(bucket)X
-2232(+)X
-2311(max-)X
-720 2192(imum)N
-927(split)X
-1085(point.)X
-1310(We)X
-1442(can)X
-1574(determine)X
-1915(which)X
-2131(keys)X
-2298(move)X
-720 2280(to)N
-807(the)X
-929(new)X
-1087(bucket)X
-1325(by)X
-1429(examining)X
-1791(the)X
-2 f
-1913(n)X
-7 s
-1962 2248(th)N
-10 s
-1 f
-2043 2280(bit)N
-2151(of)X
-2242(a)X
-2302(key's)X
-720 2368(hash)N
-899(value)X
-1105(where)X
-1334(n)X
-1406(is)X
-1491(the)X
-1620(generation)X
-1990(number.)X
-2306(After)X
-720 2456(the)N
-846(bucket)X
-1088(at)X
-1174(the)X
-1300(maximum)X
-1651(split)X
-1815(point)X
-2006(has)X
-2140(been)X
-2319(split,)X
-720 2544(the)N
-839(generation)X
-1198(number)X
-1463(is)X
-1536(incremented,)X
-1973(the)X
-2091(current)X
-2339(split)X
-720 2632(point)N
-908(is)X
-985(set)X
-1098(back)X
-1274(to)X
-1360(zero,)X
-1543(and)X
-1683(the)X
-1805(maximum)X
-2152(split)X
-2312(point)X
-720 2720(is)N
-815(set)X
-946(to)X
-1050(the)X
-1190(number)X
-1477(of)X
-1586(the)X
-1725(last)X
-1877(bucket)X
-2132(in)X
-2235(the)X
-2374(\256le)X
-720 2808(\(which)N
-971(is)X
-1052(equal)X
-1253(to)X
-1342(twice)X
-1543(the)X
-1668(old)X
-1797(maximum)X
-2148(split)X
-2312(point)X
-720 2896(plus)N
-873(1\).)X
-892 3010(To)N
-1031(facilitate)X
-1361(locating)X
-1668(keys,)X
-1884(we)X
-2027(maintain)X
-2356(two)X
-720 3098(masks.)N
-989(The)X
-1143(low)X
-1291(mask)X
-1488(is)X
-1569(equal)X
-1771(to)X
-1861(the)X
-1987(maximum)X
-2339(split)X
-720 3186(bucket)N
-967(and)X
-1116(the)X
-1247(high)X
-1422(mask)X
-1624(is)X
-1710(equal)X
-1917(to)X
-2011(the)X
-2141(next)X
-2311(max-)X
-720 3274(imum)N
-931(split)X
-1093(bucket.)X
-1372(To)X
-1486(locate)X
-1703(a)X
-1764(speci\256c)X
-2033(key,)X
-2193(we)X
-2311(com-)X
-720 3362(pute)N
-881(a)X
-940(32-bit)X
-1154(hash)X
-1324(value)X
-1520(using)X
-1715(a)X
-1773(bit-randomizing)X
-2311(algo-)X
-720 3450(rithm)N
-932(such)X
-1118(as)X
-1224(the)X
-1361(one)X
-1516(described)X
-1862(in)X
-1962([LAR88].)X
-2334(This)X
-720 3538(hash)N
-893(value)X
-1093(is)X
-1172(then)X
-1336(masked)X
-1607(with)X
-1775(the)X
-1898(high)X
-2065(mask.)X
-2299(If)X
-2378(the)X
-720 3626(resulting)N
-1026(number)X
-1297(is)X
-1376(greater)X
-1626(than)X
-1790(the)X
-1913(maximum)X
-2262(bucket)X
-720 3714(in)N
-823(the)X
-962(table)X
-1159(\(current)X
-1455(split)X
-1633(bucket)X
-1888(+)X
-1974(maximum)X
-2339(split)X
-720 3802(point\),)N
-962(the)X
-1091(hash)X
-1269(value)X
-1474(is)X
-1558(masked)X
-1834(with)X
-2007(the)X
-2136(low)X
-2287(mask.)X
-720 3890(In)N
-825(either)X
-1046(case,)X
-1242(the)X
-1377(result)X
-1592(of)X
-1696(the)X
-1831(mask)X
-2037(is)X
-2127(the)X
-2262(bucket)X
-720 3978(number)N
-989(for)X
-1107(the)X
-1229(given)X
-1431(key.)X
-1611(The)X
-1759(algorithm)X
-2093(below)X
-2312(illus-)X
-720 4066(trates)N
-914(this)X
-1049(process.)X
-0 f
-8 s
-720 4365(h)N
-796(=)X
-872 -0.4038(calchash\(key\);)AX
-720 4453(bucket)N
-986(=)X
-1062(h)X
-1138(&)X
-1214 -0.4167(high_mask;)AX
-720 4541(if)N
-834(\()X
-910(bucket)X
-1176(>)X
-1252 -0.4167(max_bucket)AX
-1670(\))X
-1008 4629(bucket)N
-1274(=)X
-1350(h)X
-1426(&)X
-1502 -0.4219(low_mask;)AX
-720 4717 -0.4018(return\(bucket\);)AN
-1 f
-10 s
-892 5042(In)N
-1013(order)X
-1237(to)X
-1353(decide)X
-1617(when)X
-1845(to)X
-1961(split)X
-2152(a)X
-2242(bucket,)X
-2 f
-720 5130(dynahash)N
-1 f
-1050(uses)X
-2 f
-1210(controlled)X
-1561(splitting)X
-1 f
-1822(.)X
-1884(A)X
-1964(hash)X
-2133(table)X
-2311(has)X
-2440(a)X
-720 5218(\256ll)N
-837(factor)X
-1054(which)X
-1279(is)X
-1361(expressed)X
-1707(in)X
-1798(terms)X
-2004(of)X
-2099(the)X
-2225(average)X
-720 5306(number)N
-990(of)X
-1082(keys)X
-1253(in)X
-1339(each)X
-1511(bucket.)X
-1789(Each)X
-1974(time)X
-2140(the)X
-2262(table's)X
-720 5394(total)N
-885(number)X
-1153(of)X
-1243(keys)X
-1413(divided)X
-1676(by)X
-1778(its)X
-1875(number)X
-2142(of)X
-2231(buckets)X
-720 5482(exceeds)N
-995(this)X
-1130(\256ll)X
-1238(factor,)X
-1466(a)X
-1522(bucket)X
-1756(is)X
-1829(split.)X
-2878 538(Since)N
-3079(the)X
-2 f
-3200(hsearch)X
-1 f
-3477(create)X
-3693(interface)X
-3998(\()X
-2 f
-4025(hcreate)X
-1 f
-4266(\))X
-4315(calls)X
-2706 626(for)N
-2842(an)X
-2960(estimate)X
-3269(of)X
-3378(the)X
-3518(\256nal)X
-3702(size)X
-3869(of)X
-3978(the)X
-4118(hash)X
-4306(table)X
-2706 714(\()N
-2 f
-2733(nelem)X
-1 f
-2925(\),)X
-2 f
-3007(dynahash)X
-1 f
-3349(uses)X
-3522(this)X
-3672(information)X
-4085(to)X
-4182(initialize)X
-2706 802(the)N
-2848(table.)X
-3088(The)X
-3257(initial)X
-3486(number)X
-3774(of)X
-3884(buckets)X
-4172(is)X
-4268(set)X
-4400(to)X
-2 f
-2706 890(nelem)N
-1 f
-2926(rounded)X
-3217(to)X
-3306(the)X
-3431(next)X
-3596(higher)X
-3828(power)X
-4056(of)X
-4150(two.)X
-4337(The)X
-2706 978(current)N
-2958(split)X
-3118(point)X
-3305(is)X
-3381(set)X
-3493(to)X
-3578(0)X
-3641(and)X
-3780(the)X
-3901(maximum)X
-4248(bucket)X
-2706 1066(and)N
-2842(maximum)X
-3186(split)X
-3343(point)X
-3527(are)X
-3646(set)X
-3755(to)X
-3837(this)X
-3972(rounded)X
-4255(value.)X
-3 f
-3148 1220(The)N
-3301(New)X
-3473(Implementation)X
-1 f
-2878 1352(Our)N
-3042(implementation)X
-3583(is)X
-3675(also)X
-3842(based)X
-4063(on)X
-4181(Larson's)X
-2706 1440(linear)N
-2939(hashing)X
-3238([LAR88])X
-3582(algorithm)X
-3943(as)X
-4060(well)X
-4248(as)X
-4364(the)X
-2 f
-2706 1528(dynahash)N
-1 f
-3047(implementation.)X
-3623(The)X
-2 f
-3782(dbm)X
-1 f
-3954(family)X
-4197(of)X
-4297(algo-)X
-2706 1616(rithms)N
-2942(decide)X
-3184(dynamically)X
-3612(which)X
-3840(bucket)X
-4085(to)X
-4178(split)X
-4346(and)X
-2706 1704(when)N
-2914(to)X
-3010(split)X
-3180(it)X
-3257(\(when)X
-3491(it)X
-3568(over\257ows\))X
-3944(while)X
-2 f
-4155(dynahash)X
-1 f
-2706 1792(splits)N
-2933(in)X
-3054(a)X
-3149(prede\256ned)X
-3547(order)X
-3776(\(linearly\))X
-4134(and)X
-4309(at)X
-4426(a)X
-2706 1880(prede\256ned)N
-3116(time)X
-3328(\(when)X
-3599(the)X
-3767(table)X
-3993(\256ll)X
-4151(factor)X
-4409(is)X
-2706 1968(exceeded\).)N
-3121(We)X
-3280(use)X
-3434(a)X
-3517(hybrid)X
-3773(of)X
-3887(these)X
-4099(techniques.)X
-2706 2056(Splits)N
-2913(occur)X
-3118(in)X
-3206(the)X
-3330(prede\256ned)X
-3695(order)X
-3891(of)X
-3984(linear)X
-4193(hashing,)X
-2706 2144(but)N
-2845(the)X
-2980(time)X
-3159(at)X
-3253(which)X
-3485(pages)X
-3704(are)X
-3839(split)X
-4012(is)X
-4101(determined)X
-2706 2232(both)N
-2869(by)X
-2970(page)X
-3143(over\257ows)X
-3480(\()X
-2 f
-3507(uncontrolled)X
-3937(splitting)X
-1 f
-4198(\))X
-4246(and)X
-4382(by)X
-2706 2320(exceeding)N
-3052(the)X
-3170(\256ll)X
-3278(factor)X
-3486(\()X
-2 f
-3513(controlled)X
-3862(splitting)X
-1 f
-4123(\))X
-2878 2434(A)N
-2962(hash)X
-3135(table)X
-3317(is)X
-3395(parameterized)X
-3876(by)X
-3981(both)X
-4148(its)X
-4248(bucket)X
-2706 2522(size)N
-2904(\()X
-2 f
-2931(bsize)X
-1 f
-(\))S
-3191(and)X
-3380(\256ll)X
-3541(factor)X
-3801(\()X
-2 f
-3828(ffactor)X
-1 f
-4041(\).)X
-4180(Whereas)X
-2 f
-2706 2610(dynahash's)N
-1 f
-3095(buckets)X
-3364(can)X
-3500(be)X
-3599(represented)X
-3993(as)X
-4083(a)X
-4142(linked)X
-4365(list)X
-2706 2698(of)N
-2798(elements)X
-3108(in)X
-3195(memory,)X
-3507(our)X
-3639(package)X
-3928(needs)X
-4136(to)X
-4222(support)X
-2706 2786(disk)N
-2874(access,)X
-3135(and)X
-3286(must)X
-3476(represent)X
-3806(buckets)X
-4086(in)X
-4183(terms)X
-4395(of)X
-2706 2874(pages.)N
-2955(The)X
-2 f
-3106(bsize)X
-1 f
-3291(is)X
-3369(the)X
-3492(size)X
-3642(\(in)X
-3756(bytes\))X
-3977(of)X
-4069(these)X
-4259(pages.)X
-2706 2962(As)N
-2833(in)X
-2933(linear)X
-3154(hashing,)X
-3461(the)X
-3597(number)X
-3879(of)X
-3983(buckets)X
-4265(in)X
-4364(the)X
-2706 3050(table)N
-2906(is)X
-3003(equal)X
-3221(to)X
-3327(the)X
-3469(number)X
-3758(of)X
-3869(keys)X
-4060(in)X
-4165(the)X
-4306(table)X
-2706 3138(divided)N
-2988(by)X
-2 f
-3110(ffactor)X
-1 f
-3323(.)X
-2 f
-8 s
-3113(6)Y
-1 f
-10 s
-3417 3138(The)N
-3584(controlled)X
-3950(splitting)X
-4252(occurs)X
-2706 3226(each)N
-2878(time)X
-3044(the)X
-3166(number)X
-3435(of)X
-3526(keys)X
-3697(in)X
-3783(the)X
-3905(table)X
-4085(exceeds)X
-4364(the)X
-2706 3314(\256ll)N
-2814(factor)X
-3022(multiplied)X
-3370(by)X
-3470(the)X
-3588(number)X
-3853(of)X
-3940(buckets.)X
-2878 3428(Inserting)N
-3187(keys)X
-3358(and)X
-3498(splitting)X
-3783(buckets)X
-4051(is)X
-4127(performed)X
-2706 3516(precisely)N
-3018(as)X
-3107(described)X
-3437(previously)X
-3796(for)X
-2 f
-3911(dynahash)X
-1 f
-4218(.)X
-4279(How-)X
-2706 3604(ever,)N
-2897(since)X
-3094(buckets)X
-3371(are)X
-3502(now)X
-3671(comprised)X
-4036(of)X
-4134(pages,)X
-4368(we)X
-2706 3692(must)N
-2883(be)X
-2981(prepared)X
-3284(to)X
-3367(handle)X
-3602(cases)X
-3793(where)X
-4011(the)X
-4130(size)X
-4276(of)X
-4364(the)X
-2706 3780(keys)N
-2873(and)X
-3009(data)X
-3163(in)X
-3245(a)X
-3301(bucket)X
-3535(exceed)X
-3779(the)X
-3897(bucket)X
-4131(size.)X
-3 f
-3318 3934(Over\257ow)N
-3654(Pages)X
-1 f
-2878 4066(There)N
-3095(are)X
-3223(two)X
-3372(cases)X
-3571(where)X
-3797(a)X
-3862(key)X
-4007(may)X
-4174(not)X
-4305(\256t)X
-4400(in)X
-2706 4154(its)N
-2802(designated)X
-3166(bucket.)X
-3441(In)X
-3529(the)X
-3647(\256rst)X
-3791(case,)X
-3970(the)X
-4088(total)X
-4250(size)X
-4395(of)X
-2706 4242(the)N
-2833(key)X
-2978(and)X
-3123(data)X
-3286(may)X
-3453(exceed)X
-3706(the)X
-3833(bucket)X
-4076(size.)X
-4269(In)X
-4364(the)X
-2706 4330(second,)N
-3008(addition)X
-3328(of)X
-3453(a)X
-3547(new)X
-3739(key)X
-3913(could)X
-4149(cause)X
-4386(an)X
-2706 4418(over\257ow,)N
-3068(but)X
-3227(the)X
-3382(bucket)X
-3652(in)X
-3770(question)X
-4097(is)X
-4206(not)X
-4364(yet)X
-2706 4506(scheduled)N
-3049(to)X
-3133(be)X
-3230(split.)X
-3428(In)X
-3516(existing)X
-3790(implementations,)X
-4364(the)X
-2706 4594(second)N
-2953(case)X
-3115(never)X
-3317(arises)X
-3523(\(since)X
-3738(buckets)X
-4006(are)X
-4128(split)X
-4288(when)X
-2706 4682(they)N
-2871(over\257ow\))X
-3210(and)X
-3352(the)X
-3476(\256rst)X
-3626(case)X
-3791(is)X
-3870(not)X
-3998(handled)X
-4278(at)X
-4362(all.)X
-2706 4770(Although)N
-3036(large)X
-3225(key/data)X
-3525(pair)X
-3678(handling)X
-3986(is)X
-4066(dif\256cult)X
-4346(and)X
-2706 4858(expensive,)N
-3083(it)X
-3163(is)X
-3252(essential.)X
-3604(In)X
-3706(a)X
-3777(linear)X
-3995(hashed)X
-4253(imple-)X
-2706 4946(mentation,)N
-3087(over\257ow)X
-3413(pages)X
-3636(are)X
-3775(required)X
-4083(for)X
-4217(buckets)X
-2706 5034(which)N
-2935(over\257ow)X
-3253(before)X
-3492(they)X
-3662(are)X
-3793(split,)X
-3982(so)X
-4085(we)X
-4211(can)X
-4355(use)X
-2706 5122(the)N
-2833(same)X
-3027(mechanism)X
-3421(for)X
-3544(large)X
-3734(key/data)X
-4035(pairs)X
-4220(that)X
-4368(we)X
-2706 5210(use)N
-2837(for)X
-2955(over\257ow)X
-3264(pages.)X
-3511(Logically,)X
-3862(we)X
-3980(chain)X
-4177(over\257ow)X
-16 s
-2706 5353 MXY
-864 0 Dl
-2 f
-8 s
-2746 5408(6)N
-1 f
-9 s
-2801 5433(This)N
-2952(is)X
-3023(not)X
-3138(strictly)X
-3361(true.)X
-3532(The)X
-3667(\256le)X
-3782(does)X
-3937(not)X
-4052(contract)X
-4306(when)X
-2706 5513(keys)N
-2861(are)X
-2972(deleted,)X
-3221(so)X
-3308(the)X
-3419(number)X
-3662(of)X
-3744(buckets)X
-3986(is)X
-4056(actually)X
-4306(equal)X
-2706 5593(to)N
-2782(the)X
-2890(maximum)X
-3202(number)X
-3441(of)X
-3520(keys)X
-3671(ever)X
-3814(present)X
-4041(in)X
-4116(the)X
-4223(table)X
-4382(di-)X
-2706 5673(vided)N
-2884(by)X
-2974(the)X
-3080(\256ll)X
-3178(factor.)X
-3 f
-10 s
-720 5960(USENIX)N
-9 f
-1042(-)X
-3 f
-1106(Winter)X
-1371('91)X
-9 f
-1498(-)X
-3 f
-1562(Dallas,)X
-1815(TX)X
-4424(5)X
-
-6 p
-%%Page: 6 6
-0(Courier)xf 0 f
-10 s 10 xH 0 xS 0 f
-3 f
-432 258(A)N
-510(New)X
-682(Hashing)X
-985(Package)X
-1290(for)X
-1413(UNIX)X
-3663(Seltzer)X
-3920(&)X
-4007(Yigit)X
-1 f
-432 538(pages)N
-639(to)X
-725(the)X
-847(buckets)X
-1116(\(also)X
-1296(called)X
-1512(primary)X
-1789(pages\).)X
-2062(In)X
-2152(a)X
-432 626(memory)N
-730(based)X
-943(representation,)X
-1448(over\257ow)X
-1763(pages)X
-1976(do)X
-2086(not)X
-432 714(pose)N
-628(any)X
-792(special)X
-1063(problems)X
-1409(because)X
-1712(we)X
-1854(can)X
-2014(chain)X
-432 802(over\257ow)N
-776(pages)X
-1017(to)X
-1137(primary)X
-1449(pages)X
-1690(using)X
-1921(memory)X
-432 890(pointers.)N
-776(However,)X
-1137(mapping)X
-1463(these)X
-1674(over\257ow)X
-2005(pages)X
-432 978(into)N
-584(a)X
-648(disk)X
-809(\256le)X
-939(is)X
-1019(more)X
-1211(of)X
-1305(a)X
-1368(challenge,)X
-1723(since)X
-1915(we)X
-2036(need)X
-432 1066(to)N
-547(be)X
-675(able)X
-861(to)X
-975(address)X
-1268(both)X
-1462(bucket)X
-1728(pages,)X
-1983(whose)X
-432 1154(numbers)N
-729(are)X
-849(growing)X
-1137(linearly,)X
-1422(and)X
-1558(some)X
-1747(indeterminate)X
-432 1242(number)N
-715(of)X
-820(over\257ow)X
-1143(pages)X
-1364(without)X
-1646(reorganizing)X
-2090(the)X
-432 1330(\256le.)N
-604 1444(One)N
-789(simple)X
-1053(solution)X
-1361(would)X
-1612(be)X
-1739(to)X
-1852(allocate)X
-2152(a)X
-432 1532(separate)N
-737(\256le)X
-880(for)X
-1015(over\257ow)X
-1341(pages.)X
-1604(The)X
-1769(disadvantage)X
-432 1620(with)N
-605(such)X
-783(a)X
-850(technique)X
-1193(is)X
-1276(that)X
-1426(it)X
-1500(requires)X
-1789(an)X
-1895(extra)X
-2086(\256le)X
-432 1708(descriptor,)N
-794(an)X
-891(extra)X
-1073(system)X
-1316(call)X
-1453(on)X
-1554(open)X
-1731(and)X
-1867(close,)X
-2072(and)X
-432 1796(logically)N
-739(associating)X
-1122(two)X
-1269(independent)X
-1687(\256les.)X
-1886(For)X
-2023(these)X
-432 1884(reasons,)N
-728(we)X
-857(wanted)X
-1123(to)X
-1219(map)X
-1391(both)X
-1567(primary)X
-1855(pages)X
-2072(and)X
-432 1972(over\257ow)N
-737(pages)X
-940(into)X
-1084(the)X
-1202(same)X
-1387(\256le)X
-1509(space.)X
-604 2086(The)N
-799(buddy-in-waiting)X
-1425(algorithm)X
-1806(provides)X
-2152(a)X
-432 2174(mechanism)N
-851(to)X
-966(support)X
-1259(multiple)X
-1578(pages)X
-1814(per)X
-1970(logical)X
-432 2262(bucket)N
-685(while)X
-902(retaining)X
-1226(the)X
-1362(simple)X
-1613(split)X
-1788(sequence)X
-2121(of)X
-432 2350(linear)N
-681(hashing.)X
-1015(Over\257ow)X
-1383(pages)X
-1631(are)X
-1795(preallocated)X
-432 2438(between)N
-781(generations)X
-1232(of)X
-1379(primary)X
-1713(pages.)X
-1996(These)X
-432 2526(over\257ow)N
-759(pages)X
-984(are)X
-1125(used)X
-1314(by)X
-1436(any)X
-1594(bucket)X
-1850(containing)X
-432 2614(more)N
-646(keys)X
-842(than)X
-1029(\256t)X
-1144(on)X
-1273(the)X
-1420(primary)X
-1723(page)X
-1924(and)X
-2089(are)X
-432 2702(reclaimed,)N
-808(if)X
-896(possible,)X
-1217(when)X
-1430(the)X
-1567(bucket)X
-1819(later)X
-2000(splits.)X
-432 2790(Figure)N
-687(3)X
-773(depicts)X
-1045(the)X
-1188(layout)X
-1433(of)X
-1545(primary)X
-1844(pages)X
-2072(and)X
-432 2878(over\257ow)N
-752(pages)X
-970(within)X
-1209(the)X
-1342(same)X
-1542(\256le.)X
-1699(Over\257ow)X
-2036(page)X
-432 2966(use)N
-586(information)X
-1011(is)X
-1111(recorded)X
-1440(in)X
-1548(bitmaps)X
-1847(which)X
-2089(are)X
-432 3054(themselves)N
-819(stored)X
-1046(on)X
-1157(over\257ow)X
-1472(pages.)X
-1725(The)X
-1880(addresses)X
-432 3142(of)N
-520(the)X
-639(bitmap)X
-882(pages)X
-1086(and)X
-1223(the)X
-1342(number)X
-1608(of)X
-1695(pages)X
-1898(allocated)X
-432 3230(at)N
-515(each)X
-688(split)X
-850(point)X
-1039(are)X
-1163(stored)X
-1384(in)X
-1470(the)X
-1592(\256le)X
-1718(header.)X
-1997(Using)X
-432 3318(this)N
-577(information,)X
-1005(both)X
-1177(over\257ow)X
-1492(addresses)X
-1829(and)X
-1974(bucket)X
-432 3406(addresses)N
-764(can)X
-900(be)X
-999(mapped)X
-1276(to)X
-1361(disk)X
-1517(addresses)X
-1848(by)X
-1951(the)X
-2072(fol-)X
-432 3494(lowing)N
-674(calculation:)X
-0 f
-8 s
-432 3793(int)N
-736(bucket;)X
-1192(/*)X
-1306(bucket)X
-1572(address)X
-1876(*/)X
-432 3881(u_short)N
-736(oaddr;)X
-1192(/*)X
-1306(OVERFLOW)X
-1648(address)X
-1952(*/)X
-432 3969(int)N
-736 -0.4125(nhdr_pages;)AX
-1192(/*)X
-1306(npages)X
-1572(in)X
-1686 -112.4062(\256le)AX
-1838(header)X
-2104(*/)X
-432 4057(int)N
-736 -0.4125(spares[32];)AX
-1192(/*)X
-1306(npages)X
-1572(at)X
-1686(each)X
-1876(split)X
-2104(*/)X
-432 4145(int)N
-736(log2\(\);)X
-1198(/*)X
-1312(ceil\(log)X
-1654(base)X
-1844(2\))X
-1958(*/)X
-432 4321(#DEFINE)N
-736 -0.3929(BUCKET_TO_PAGE\(bucket\))AX
-1610(\\)X
-584 4409(bucket)N
-850(+)X
-926 -0.4167(nhdr_pages)AX
-1344(+)X
-1420(\\)X
-584 4497 -0.3894(\(bucket?spares[logs2\(bucket)AN
-1648(+)X
-1724(1\)-1]:0\))X
-432 4673(#DEFINE)N
-736 -0.3947(OADDR_TO_PAGE\(oaddr\))AX
-1534(\\)X
-584 4761 -0.3984(BUCKET_TO_PAGE\(\(1)AN
-1268(<<)X
-1382 -0.4091(\(oaddr>>11\)\))AX
-1876(-)X
-1952(1\))X
-2066(+)X
-2142(\\)X
-584 4849(oaddr)N
-812(&)X
-888(0x7ff;)X
-1 f
-10 s
-604 5262(An)N
-728(over\257ow)X
-1039(page)X
-1217(is)X
-1295(addressed)X
-1637(by)X
-1742(its)X
-1842(split)X
-2004(point,)X
-432 5350(identifying)N
-858(the)X
-1031(generations)X
-1476(between)X
-1819(which)X
-2090(the)X
-432 5438(over\257ow)N
-740(page)X
-915(is)X
-991(allocated,)X
-1324(and)X
-1463(its)X
-1561(page)X
-1736(number,)X
-2023(iden-)X
-432 5526(tifying)N
-665(the)X
-783(particular)X
-1111(page)X
-1283(within)X
-1507(the)X
-1625(split)X
-1782(point.)X
-1986(In)X
-2073(this)X
-432 5614(implementation,)N
-983(offsets)X
-1225(within)X
-1457(pages)X
-1668(are)X
-1795(16)X
-1903(bits)X
-2046(long)X
-432 5702(\(limiting)N
-732(the)X
-851(maximum)X
-1196(page)X
-1368(size)X
-1513(to)X
-1595(32K\),)X
-1800(so)X
-1891(we)X
-2005(select)X
-2418 538(an)N
-2535(over\257ow)X
-2860(page)X
-3052(addressing)X
-3435(algorithm)X
-3786(that)X
-3946(can)X
-4098(be)X
-2418 626(expressed)N
-2760(in)X
-2847(16)X
-2952(bits)X
-3091(and)X
-3231(which)X
-3451(allows)X
-3684(quick)X
-3886(retrieval.)X
-2418 714(The)N
-2568(top)X
-2695(\256ve)X
-2840(bits)X
-2980(indicate)X
-3258(the)X
-3380(split)X
-3541(point)X
-3729(and)X
-3869(the)X
-3991(lower)X
-2418 802(eleven)N
-2650(indicate)X
-2926(the)X
-3046(page)X
-3220(number)X
-3487(within)X
-3713(the)X
-3832(split)X
-3990(point.)X
-2418 890(Since)N
-2633(\256ve)X
-2789(bits)X
-2940(are)X
-3075(reserved)X
-3384(for)X
-3514(the)X
-3648(split)X
-3821(point,)X
-4041(\256les)X
-2418 978(may)N
-2578(split)X
-2737(32)X
-2839(times)X
-3034(yielding)X
-3318(a)X
-3376(maximum)X
-3721(\256le)X
-3844(size)X
-3990(of)X
-4078(2)X
-7 s
-946(32)Y
-10 s
-2418 1066(buckets)N
-2698(and)X
-2849(32)X
-2 f
-(*)S
-1 f
-2982(2)X
-7 s
-1034(11)Y
-10 s
-3113 1066(over\257ow)N
-3433(pages.)X
-3691(The)X
-3850(maximum)X
-2418 1154(page)N
-2597(size)X
-2749(is)X
-2829(2)X
-7 s
-1122(15)Y
-10 s
-1154(,)Y
-2971(yielding)X
-3259(a)X
-3321(maximum)X
-3671(\256le)X
-3799(size)X
-3950(greater)X
-2418 1242(than)N
-2601(131,000)X
-2906(GB)X
-3061(\(on)X
-3212(\256le)X
-3358(systems)X
-3655(supporting)X
-4041(\256les)X
-2418 1330(larger)N
-2626(than)X
-2784(4GB\).)X
-10 f
-2418 1418 -0.0930(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)AN
-1 Dt
-4014 2275 MXY
-0 133 Dl
-3881 2275 MXY
-0 133 Dl
-3748 2275 MXY
-0 133 Dl
-3083 2275 MXY
-0 133 Dl
-5 s
-1 f
-3523 2475(2/3)N
-3390(2/2)X
-3257(2/1)X
-2859(1/2)X
-2726(1/1)X
-5 Dt
-3814 1743 MXY
-0 133 Dl
-3282 1743 MXY
-0 133 Dl
-3017 1743 MXY
-0 133 Dl
-2884 1743 MXY
-0 133 Dl
-1 Dt
-3681 1743 MXY
-0 133 Dl
-133 0 Dl
-0 -133 Dl
--133 0 Dl
-3548 MX
-0 133 Dl
-133 0 Dl
-0 -133 Dl
--133 0 Dl
-3415 MX
-0 133 Dl
-133 0 Dl
-0 -133 Dl
--133 0 Dl
-3282 MX
-0 133 Dl
-133 0 Dl
-0 -133 Dl
--133 0 Dl
-3150 MX
-0 133 Dl
-132 0 Dl
-0 -133 Dl
--132 0 Dl
-3017 MX
-0 133 Dl
-133 0 Dl
-0 -133 Dl
--133 0 Dl
-2884 MX
-0 133 Dl
-133 0 Dl
-0 -133 Dl
--133 0 Dl
-3 f
-8 s
-3017 2601(Over\257ow)N
-3285(Addresses)X
-3515 2833(Over\257ow)N
-3783(Pages)X
-2850(Buckets)X
-1 Di
-3349 2740 MXY
- 3349 2740 lineto
- 3482 2740 lineto
- 3482 2873 lineto
- 3349 2873 lineto
- 3349 2740 lineto
-closepath 3 3349 2740 3482 2873 Dp
-2684 MX
-0 133 Dl
-133 0 Dl
-0 -133 Dl
--133 0 Dl
-5 Dt
-4146 2275 MXY
-0 133 Dl
-3216 2275 MXY
-0 133 Dl
-2684 2275 MXY
-0 133 Dl
-2551 2275 MXY
-0 133 Dl
-1 f
-3798 1963(3)N
-3266 1980(2)N
-3001(1)X
-2868(0)X
-1 Dt
-2751 1743 MXY
-0 133 Dl
-133 0 Dl
-0 -133 Dl
--133 0 Dl
-3548 2275 MXY
--15 -22 Dl
-2 16 Dl
--13 11 Dl
-26 -5 Dl
--282 -117 Dl
-3432 2275 MXY
--10 -25 Dl
--2 16 Dl
--15 8 Dl
-27 1 Dl
--166 -117 Dl
-3282 2275 MXY
-12 -25 Dl
--14 10 Dl
--15 -6 Dl
-17 21 Dl
--16 -117 Dl
-2884 2275 MXY
-26 7 Dl
--12 -12 Dl
-3 -16 Dl
--17 21 Dl
-382 -117 Dl
-2751 2275 MXY
-25 9 Dl
--11 -12 Dl
-5 -17 Dl
--19 20 Dl
-515 -117 Dl
-3 f
-3070 2152(Over\257ow)N
-3338(Pages)X
-3482 2275 MXY
- 3482 2275 lineto
- 3615 2275 lineto
- 3615 2408 lineto
- 3482 2408 lineto
- 3482 2275 lineto
-closepath 3 3482 2275 3615 2408 Dp
-3349 MX
- 3349 2275 lineto
- 3482 2275 lineto
- 3482 2408 lineto
- 3349 2408 lineto
- 3349 2275 lineto
-closepath 3 3349 2275 3482 2408 Dp
-3216 MX
- 3216 2275 lineto
- 3349 2275 lineto
- 3349 2408 lineto
- 3216 2408 lineto
- 3216 2275 lineto
-closepath 3 3216 2275 3349 2408 Dp
-2817 MX
- 2817 2275 lineto
- 2950 2275 lineto
- 2950 2408 lineto
- 2817 2408 lineto
- 2817 2275 lineto
-closepath 3 2817 2275 2950 2408 Dp
-2684 MX
- 2684 2275 lineto
- 2817 2275 lineto
- 2817 2408 lineto
- 2684 2408 lineto
- 2684 2275 lineto
-closepath 3 2684 2275 2817 2408 Dp
-3615 MX
-0 133 Dl
-531 0 Dl
-0 -133 Dl
--531 0 Dl
-2950 MX
-0 133 Dl
-266 0 Dl
-0 -133 Dl
--266 0 Dl
-2551 MX
-0 133 Dl
-133 0 Dl
-0 -133 Dl
--133 0 Dl
-3798 1726 MXY
--21 -18 Dl
-6 16 Dl
--10 13 Dl
-25 -11 Dl
--599 -99 Dl
-3266 1726 MXY
--1 -27 Dl
--7 15 Dl
--17 1 Dl
-25 11 Dl
--67 -99 Dl
-3033 1726 MXY
-27 1 Dl
--14 -8 Dl
--1 -17 Dl
--12 24 Dl
-166 -99 Dl
-2900 1726 MXY
-27 7 Dl
--13 -11 Dl
-3 -17 Dl
--17 21 Dl
-299 -99 Dl
-3058 1621(Split)N
-3203(Points)X
-2418 2275 MXY
-0 133 Dl
-133 0 Dl
-0 -133 Dl
--133 0 Dl
-3 Dt
--1 Ds
-3137(Figure)Y
-2619(3:)X
-1 f
-2691(Split)X
-2832(points)X
-3008(occur)X
-3168(between)X
-3399(generations)X
-3712(and)X
-3823(are)X
-3919(numbered)X
-2418 3225(from)N
-2560(0.)X
-2642(In)X
-2713(this)X
-2824(\256gure)X
-2991(there)X
-3136(are)X
-3231(two)X
-3345(over\257ow)X
-3590(pages)X
-3753(allocated)X
-4000(at)X
-4063(split)X
-2418 3313(point)N
-2566(1)X
-2614(and)X
-2722(three)X
-2865(allocated)X
-3111(at)X
-3173(split)X
-3300(point)X
-3448(2.)X
-10 s
-10 f
-2418 3489 -0.0930(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)AN
-3 f
-2949 3731(Buffer)N
-3192(Management)X
-1 f
-2590 3863(The)N
-2744(hash)X
-2920(table)X
-3105(is)X
-3187(stored)X
-3412(in)X
-3502(memory)X
-3797(as)X
-3892(a)X
-3956(logical)X
-2418 3951(array)N
-2633(of)X
-2749(bucket)X
-3012(pointers.)X
-3359(Physically,)X
-3761(the)X
-3907(array)X
-4121(is)X
-2418 4039(arranged)N
-2728(in)X
-2818(segments)X
-3144(of)X
-3239(256)X
-3387(pointers.)X
-3713(Initially,)X
-4013(there)X
-2418 4127(is)N
-2530(space)X
-2767(to)X
-2887(allocate)X
-3195(256)X
-3373(segments.)X
-3769(Reallocation)X
-2418 4215(occurs)N
-2651(when)X
-2847(the)X
-2967(number)X
-3234(of)X
-3323(buckets)X
-3590(exceeds)X
-3867(32K)X
-4027(\(256)X
-2418 4303(*)N
-2508(256\).)X
-2745(Primary)X
-3053(pages)X
-3286(may)X
-3473(be)X
-3598(accessed)X
-3929(directly)X
-2418 4391(through)N
-2711(the)X
-2853(array)X
-3062(by)X
-3185(bucket)X
-3442(number)X
-3730(and)X
-3889(over\257ow)X
-2418 4479(pages)N
-2628(are)X
-2754 0.4028(referenced)AX
-3122(logically)X
-3429(by)X
-3536(their)X
-3710(over\257ow)X
-4022(page)X
-2418 4567(address.)N
-2726(For)X
-2864(small)X
-3063(hash)X
-3236(tables,)X
-3469(it)X
-3539(is)X
-3618(desirable)X
-3934(to)X
-4022(keep)X
-2418 4655(all)N
-2525(pages)X
-2735(in)X
-2823(main)X
-3009(memory)X
-3302(while)X
-3506(on)X
-3612(larger)X
-3826(tables,)X
-4059(this)X
-2418 4743(is)N
-2523(probably)X
-2860(impossible.)X
-3298(To)X
-3438(satisfy)X
-3698(both)X
-3891(of)X
-4009(these)X
-2418 4831(requirements,)N
-2900(the)X
-3041(package)X
-3348(includes)X
-3658(buffer)X
-3897(manage-)X
-2418 4919(ment)N
-2598(with)X
-2760(LRU)X
-2940(\(least)X
-3134(recently)X
-3413(used\))X
-3607(replacement.)X
-2590 5033(By)N
-2730(default,)X
-3020(the)X
-3165(package)X
-3475(allocates)X
-3802(up)X
-3928(to)X
-4036(64K)X
-2418 5121(bytes)N
-2616(of)X
-2712(buffered)X
-3014(pages.)X
-3246(All)X
-3377(pages)X
-3589(in)X
-3680(the)X
-3807(buffer)X
-4032(pool)X
-2418 5209(are)N
-2542(linked)X
-2766(in)X
-2852(LRU)X
-3036(order)X
-3230(to)X
-3316(facilitate)X
-3621(fast)X
-3761(replacement.)X
-2418 5297(Whereas)N
-2724(ef\256cient)X
-3011(access)X
-3241(to)X
-3327(primary)X
-3605(pages)X
-3812(is)X
-3889(provided)X
-2418 5385(by)N
-2521(the)X
-2642(bucket)X
-2879(array,)X
-3087(ef\256cient)X
-3372(access)X
-3600(to)X
-3684(over\257ow)X
-3991(pages)X
-2418 5473(is)N
-2501(provided)X
-2816(by)X
-2926(linking)X
-3182(over\257ow)X
-3497(page)X
-3679(buffers)X
-3936(to)X
-4027(their)X
-2418 5561(predecessor)N
-2827(page)X
-3008(\(either)X
-3247(the)X
-3374(primary)X
-3657(page)X
-3838(or)X
-3933(another)X
-2418 5649(over\257ow)N
-2742(page\).)X
-3000(This)X
-3181(means)X
-3425(that)X
-3584(an)X
-3699(over\257ow)X
-4022(page)X
-3 f
-432 5960(6)N
-2970(USENIX)X
-9 f
-3292(-)X
-3 f
-3356(Winter)X
-3621('91)X
-9 f
-3748(-)X
-3 f
-3812(Dallas,)X
-4065(TX)X
-
-7 p
-%%Page: 7 7
-0(Courier)xf 0 f
-10 s 10 xH 0 xS 0 f
-3 f
-720 258(Seltzer)N
-977(&)X
-1064(Yigit)X
-3278(A)X
-3356(New)X
-3528(Hashing)X
-3831(Package)X
-4136(for)X
-4259(UNIX)X
-1 f
-720 538(cannot)N
-955(be)X
-1052(present)X
-1305(in)X
-1388(the)X
-1507(buffer)X
-1724(pool)X
-1886(if)X
-1955(its)X
-2050(primary)X
-2324(page)X
-720 626(is)N
-804(not)X
-937(present.)X
-1240(This)X
-1413(does)X
-1591(not)X
-1724(impact)X
-1972(performance)X
-2409(or)X
-720 714(functionality,)N
-1209(because)X
-1524(an)X
-1660(over\257ow)X
-2005(page)X
-2217(will)X
-2400(be)X
-720 802(accessed)N
-1048(only)X
-1236(after)X
-1430(its)X
-1550(predecessor)X
-1975(page)X
-2172(has)X
-2324(been)X
-720 890(accessed.)N
-1068(Figure)X
-1303(4)X
-1369(depicts)X
-1622(the)X
-1746(data)X
-1905(structures)X
-2242(used)X
-2414(to)X
-720 978(manage)N
-990(the)X
-1108(buffer)X
-1325(pool.)X
-892 1092(The)N
-1040(in-memory)X
-1419(bucket)X
-1656(array)X
-1845(contains)X
-2134(pointers)X
-2414(to)X
-720 1180(buffer)N
-975(header)X
-1248(structures)X
-1617(which)X
-1870(represent)X
-2222(primary)X
-720 1268(pages.)N
-968(Buffer)X
-1203(headers)X
-1474(contain)X
-1735(modi\256ed)X
-2043(bits,)X
-2202(the)X
-2324(page)X
-720 1356(address)N
-995(of)X
-1096(the)X
-1228(buffer,)X
-1479(a)X
-1548(pointer)X
-1808(to)X
-1903(the)X
-2034(actual)X
-2259(buffer,)X
-720 1444(and)N
-875(a)X
-950(pointer)X
-1216(to)X
-1317(the)X
-1454(buffer)X
-1690(header)X
-1944(for)X
-2077(an)X
-2191(over\257ow)X
-720 1532(page)N
-901(if)X
-979(it)X
-1052(exists,)X
-1283(in)X
-1374(addition)X
-1665(to)X
-1756(the)X
-1883(LRU)X
-2072(links.)X
-2296(If)X
-2378(the)X
-720 1620(buffer)N
-950(corresponding)X
-1442(to)X
-1537(a)X
-1606(particular)X
-1947(bucket)X
-2194(is)X
-2280(not)X
-2414(in)X
-720 1708(memory,)N
-1048(its)X
-1164(pointer)X
-1432(is)X
-1526(NULL.)X
-1801(In)X
-1909(effect,)X
-2154(pages)X
-2377(are)X
-720 1796(linked)N
-950(in)X
-1042(three)X
-1233(ways.)X
-1468(Using)X
-1689(the)X
-1817(buffer)X
-2043(headers,)X
-2338(they)X
-720 1884(are)N
-851(linked)X
-1083(physically)X
-1444(through)X
-1725(the)X
-1854(LRU)X
-2045(links)X
-2231(and)X
-2378(the)X
-720 1972(over\257ow)N
-1036(links.)X
-1241(Using)X
-1462(the)X
-1590(pages)X
-1803(themselves,)X
-2209(they)X
-2377(are)X
-720 2060(linked)N
-943(logically)X
-1246(through)X
-1518(the)X
-1639(over\257ow)X
-1946(addresses)X
-2276(on)X
-2378(the)X
-720 2148(page.)N
-948(Since)X
-1162(over\257ow)X
-1482(pages)X
-1700(are)X
-1834(accessed)X
-2151(only)X
-2328(after)X
-720 2236(their)N
-904(predecessor)X
-1321(pages,)X
-1560(they)X
-1734(are)X
-1869(removed)X
-2186(from)X
-2378(the)X
-720 2324(buffer)N
-937(pool)X
-1099(when)X
-1293(their)X
-1460(primary)X
-1734(is)X
-1807(removed.)X
-10 f
-720 2412 -0.0930(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)AN
-1 Dt
-2309 3177 MXY
-24 15 Dl
--8 -15 Dl
-8 -15 Dl
--24 15 Dl
-52 0 Dl
-789 3160 MXY
--35 0 Dl
-0 -156 Dl
-1607 0 Dl
-0 173 Dl
-789 3091 MXY
--24 -15 Dl
-9 15 Dl
--9 15 Dl
-24 -15 Dl
--69 0 Dl
-2309 3125 MXY
-104 0 Dl
-0 -155 Dl
--1693 0 Dl
-0 121 Dl
-927 3160 MXY
-24 15 Dl
--9 -15 Dl
-9 -15 Dl
--24 15 Dl
-553 0 Dl
-1618 3177 MXY
-8 27 Dl
-4 -17 Dl
-16 -6 Dl
--28 -4 Dl
-138 121 Dl
-1895 3315 MXY
-28 3 Dl
--15 -9 Dl
-1 -18 Dl
--14 24 Dl
-276 -138 Dl
-3108 MY
--28 -3 Dl
-15 10 Dl
--1 17 Dl
-14 -24 Dl
--276 138 Dl
-1756 3229 MXY
--8 -27 Dl
--3 17 Dl
--16 6 Dl
-27 4 Dl
--138 -121 Dl
-1480 MX
--24 -15 Dl
-9 15 Dl
--9 15 Dl
-24 -15 Dl
--553 0 Dl
-3 f
-5 s
-1083 3073(LRU)N
-1178(chain)X
-4 Ds
-1402 3851 MXY
- 1402 3851 lineto
- 1471 3851 lineto
- 1471 3920 lineto
- 1402 3920 lineto
- 1402 3851 lineto
-closepath 19 1402 3851 1471 3920 Dp
-1445 3747(Over\257ow)N
-1613(Address)X
-1549 3609 MXY
-0 69 Dl
-1756 MX
--23 -15 Dl
-8 15 Dl
--8 15 Dl
-23 -15 Dl
--207 0 Dl
--1 Ds
-3 Dt
-1756 3419 MXY
--6 -28 Dl
--4 17 Dl
--17 5 Dl
-27 6 Dl
--138 -138 Dl
-2240 3471 MXY
-15 -24 Dl
--15 9 Dl
--15 -9 Dl
-15 24 Dl
-0 -138 Dl
-1826 3609 MXY
-15 -24 Dl
--15 9 Dl
--16 -9 Dl
-16 24 Dl
-0 -138 Dl
-1549 MX
-15 -24 Dl
--15 9 Dl
--15 -9 Dl
-15 24 Dl
-0 -138 Dl
-858 3471 MXY
-15 -24 Dl
--15 9 Dl
--15 -9 Dl
-15 24 Dl
-0 -138 Dl
-2240 3056 MXY
-15 -24 Dl
--15 9 Dl
--15 -9 Dl
-15 24 Dl
-0 -138 Dl
-1549 3056 MXY
-15 -24 Dl
--15 9 Dl
--15 -9 Dl
-15 24 Dl
-0 -138 Dl
-858 3056 MXY
-15 -24 Dl
--15 9 Dl
--15 -9 Dl
-15 24 Dl
-0 -138 Dl
-1 Dt
-2171 3471 MXY
- 2171 3471 lineto
- 2448 3471 lineto
- 2448 3609 lineto
- 2171 3609 lineto
- 2171 3471 lineto
-closepath 19 2171 3471 2448 3609 Dp
-1756 3609 MXY
- 1756 3609 lineto
- 2033 3609 lineto
- 2033 3747 lineto
- 1756 3747 lineto
- 1756 3609 lineto
-closepath 3 1756 3609 2033 3747 Dp
-1480 3471 MXY
- 1480 3471 lineto
- 1756 3471 lineto
- 1756 3609 lineto
- 1480 3609 lineto
- 1480 3471 lineto
-closepath 19 1480 3471 1756 3609 Dp
-789 MX
- 789 3471 lineto
- 1065 3471 lineto
- 1065 3609 lineto
- 789 3609 lineto
- 789 3471 lineto
-closepath 19 789 3471 1065 3609 Dp
-962 3903(Buffer)N
-1083(Header)X
-849 3851 MXY
- 849 3851 lineto
- 918 3851 lineto
- 918 3920 lineto
- 849 3920 lineto
- 849 3851 lineto
-closepath 14 849 3851 918 3920 Dp
-1756 3194 MXY
- 1756 3194 lineto
- 1895 3194 lineto
- 1895 3471 lineto
- 1756 3471 lineto
- 1756 3194 lineto
-closepath 14 1756 3194 1895 3471 Dp
-2171 3056 MXY
- 2171 3056 lineto
- 2309 3056 lineto
- 2309 3333 lineto
- 2171 3333 lineto
- 2171 3056 lineto
-closepath 14 2171 3056 2309 3333 Dp
-1480 MX
- 1480 3056 lineto
- 1618 3056 lineto
- 1618 3333 lineto
- 1480 3333 lineto
- 1480 3056 lineto
-closepath 14 1480 3056 1618 3333 Dp
-789 MX
- 789 3056 lineto
- 927 3056 lineto
- 927 3333 lineto
- 789 3333 lineto
- 789 3056 lineto
-closepath 14 789 3056 927 3333 Dp
-2780 MY
-0 138 Dl
-138 0 Dl
-0 -138 Dl
--138 0 Dl
-927 MX
-0 138 Dl
-138 0 Dl
-0 -138 Dl
--138 0 Dl
-1065 MX
-0 138 Dl
-138 0 Dl
-0 -138 Dl
--138 0 Dl
-1203 MX
-0 138 Dl
-139 0 Dl
-0 -138 Dl
--139 0 Dl
-1342 MX
-0 138 Dl
-138 0 Dl
-0 -138 Dl
--138 0 Dl
-1480 MX
-0 138 Dl
-138 0 Dl
-0 -138 Dl
--138 0 Dl
-1618 MX
-0 138 Dl
-138 0 Dl
-0 -138 Dl
--138 0 Dl
-1756 MX
-0 138 Dl
-139 0 Dl
-0 -138 Dl
--139 0 Dl
-1895 MX
-0 138 Dl
-138 0 Dl
-0 -138 Dl
--138 0 Dl
-2033 MX
-0 138 Dl
-138 0 Dl
-0 -138 Dl
--138 0 Dl
-2171 MX
-0 138 Dl
-138 0 Dl
-0 -138 Dl
--138 0 Dl
-2309 MX
-0 138 Dl
-139 0 Dl
-0 -138 Dl
--139 0 Dl
-13 s
-1048 2720(In)N
-1173(Memory)X
-1580(Bucket)X
-1918(Array)X
-867 3584(B0)N
-1558(B5)X
-2223(B10)X
-1788 3722(O1/1)N
-5 s
-1515 3903(Primay)N
-1651(Buffer)X
-4 Ds
-1990 3851 MXY
- 1990 3851 lineto
- 2059 3851 lineto
- 2059 3920 lineto
- 1990 3920 lineto
- 1990 3851 lineto
-closepath 3 1990 3851 2059 3920 Dp
-2102 3903(Over\257ow)N
-2270(Buffer)X
-3 Dt
--1 Ds
-8 s
-720 4184(Figure)N
-922(4:)X
-1 f
-996(Three)X
-1164(primary)X
-1386(pages)X
-1551(\(B0,)X
-1683(B5,)X
-1794(B10\))X
-1942(are)X
-2039(accessed)X
-2281(directly)X
-720 4272(from)N
-862(the)X
-958(bucket)X
-1146(array.)X
-1326(The)X
-1443(one)X
-1553(over\257ow)X
-1798(page)X
-1935(\(O1/1\))X
-2122(is)X
-2182(linked)X
-2359(phy-)X
-720 4360(sically)N
-915(from)X
-1067(its)X
-1155(primary)X
-1384(page's)X
-1577(buffer)X
-1759(header)X
-1955(as)X
-2035(well)X
-2172(as)X
-2252(logically)X
-720 4448(from)N
-860(its)X
-937(predecessor)X
-1253(page)X
-1389(buffer)X
-1560(\(B5\).)X
-10 s
-10 f
-720 4624 -0.0930(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)AN
-3 f
-1191 4954(Table)N
-1406(Parameterization)X
-1 f
-892 5086(When)N
-1107(a)X
-1166(hash)X
-1336(table)X
-1515(is)X
-1590(created,)X
-1865(the)X
-1985(bucket)X
-2221(size,)X
-2388(\256ll)X
-720 5174(factor,)N
-953(initial)X
-1164(number)X
-1434(of)X
-1526(elements,)X
-1856(number)X
-2125(of)X
-2216(bytes)X
-2409(of)X
-720 5262(main)N
-919(memory)X
-1225(used)X
-1411(for)X
-1543(caching,)X
-1851(and)X
-2005(a)X
-2079(user-de\256ned)X
-720 5350(hash)N
-892(function)X
-1184(may)X
-1347(be)X
-1448(speci\256ed.)X
-1797(The)X
-1946(bucket)X
-2184(size)X
-2333(\(and)X
-720 5438(page)N
-906(size)X
-1064(for)X
-1191(over\257ow)X
-1509(pages\))X
-1752(defaults)X
-2039(to)X
-2134(256)X
-2287(bytes.)X
-720 5526(For)N
-858(tables)X
-1072(with)X
-1241(large)X
-1429(data)X
-1590(items,)X
-1810(it)X
-1881(may)X
-2046(be)X
-2149(preferable)X
-720 5614(to)N
-803(increase)X
-1088(the)X
-1207(page)X
-1380(size,)X
-1545(and,)X
-1701(conversely,)X
-2089(applications)X
-720 5702(storing)N
-1002(small)X
-1235(items)X
-1467(exclusively)X
-1891(in)X
-2012(memory)X
-2338(may)X
-2706 538(bene\256t)N
-2966(from)X
-3164(a)X
-3242(smaller)X
-3520(bucket)X
-3776(size.)X
-3983(A)X
-4082(bucket)X
-4337(size)X
-2706 626(smaller)N
-2962(than)X
-3120(64)X
-3220(bytes)X
-3409(is)X
-3482(not)X
-3604(recommended.)X
-2878 740(The)N
-3031(\256ll)X
-3147(factor)X
-3363(indicates)X
-3676(a)X
-3740(desired)X
-4000(density)X
-4258(within)X
-2706 828(the)N
-2833(hash)X
-3009(table.)X
-3234(It)X
-3312(is)X
-3394(an)X
-3499(approximation)X
-3995(of)X
-4091(the)X
-4217(number)X
-2706 916(of)N
-2815(keys)X
-3004(allowed)X
-3300(to)X
-3404(accumulate)X
-3811(in)X
-3914(any)X
-4071(one)X
-4228(bucket,)X
-2706 1004(determining)N
-3119(when)X
-3319(the)X
-3442(hash)X
-3614(table)X
-3795(grows.)X
-4056(Its)X
-4161(default)X
-4409(is)X
-2706 1092(eight.)N
-2953(If)X
-3054(the)X
-3199(user)X
-3380(knows)X
-3636(the)X
-3781(average)X
-4079(size)X
-4251(of)X
-4364(the)X
-2706 1180(key/data)N
-3008(pairs)X
-3194(being)X
-3402(stored)X
-3627(in)X
-3718(the)X
-3845(table,)X
-4050(near)X
-4218(optimal)X
-2706 1268(bucket)N
-2943(sizes)X
-3122(and)X
-3261(\256ll)X
-3372(factors)X
-3614(may)X
-3775(be)X
-3874(selected)X
-4155(by)X
-4257(apply-)X
-2706 1356(ing)N
-2828(the)X
-2946(equation:)X
-0 f
-8 s
-2706 1655(\(1\))N
-2994 -0.3938(\(\(average_pair_length)AX
-3830(+)X
-3906(4\))X
-4020(*)X
-3032 1743(ffactor\))N
-3374(>=)X
-3488(bsize)X
-1 f
-10 s
-2706 2042(For)N
-2859(highly)X
-3104(time)X
-3287(critical)X
-3551(applications,)X
-3999(experimenting)X
-2706 2130(with)N
-2919(different)X
-3266(bucket)X
-3550(sizes)X
-3776(and)X
-3962(\256ll)X
-4120(factors)X
-4409(is)X
-2706 2218(encouraged.)N
-2878 2332(Figures)N
-3144(5a,b,)X
-3326(and)X
-3468(c)X
-3530(illustrate)X
-3836(the)X
-3960(effects)X
-4200(of)X
-4292(vary-)X
-2706 2420(ing)N
-2841(page)X
-3026(sizes)X
-3215(and)X
-3363(\256ll)X
-3483(factors)X
-3734(for)X
-3860(the)X
-3990(same)X
-4187(data)X
-4353(set.)X
-2706 2508(The)N
-2864(data)X
-3031(set)X
-3152(consisted)X
-3482(of)X
-3581(24474)X
-3813(keys)X
-3992(taken)X
-4198(from)X
-4386(an)X
-2706 2596(online)N
-2931(dictionary.)X
-3301(The)X
-3451(data)X
-3609(value)X
-3807(for)X
-3925(each)X
-4097(key)X
-4237(was)X
-4386(an)X
-2706 2684(ASCII)N
-2938(string)X
-3143(for)X
-3260(an)X
-3359(integer)X
-3605(from)X
-3784(1)X
-3847(to)X
-3931(24474)X
-4153(inclusive.)X
-2706 2772(The)N
-2867(test)X
-3013(run)X
-3155(consisted)X
-3488(of)X
-3590(creating)X
-3884(a)X
-3955(new)X
-4124(hash)X
-4306(table)X
-2706 2860(\(where)N
-2966(the)X
-3100(ultimate)X
-3398(size)X
-3559(of)X
-3662(the)X
-3796(table)X
-3987(was)X
-4147(known)X
-4400(in)X
-2706 2948(advance\),)N
-3054(entering)X
-3354(each)X
-3539(key/data)X
-3848(pair)X
-4010(into)X
-4171(the)X
-4306(table)X
-2706 3036(and)N
-2849(then)X
-3014(retrieving)X
-3353(each)X
-3528(key/data)X
-3827(pair)X
-3979(from)X
-4162(the)X
-4286(table.)X
-2706 3124(Each)N
-2898(of)X
-2996(the)X
-3125(graphs)X
-3369(shows)X
-3599(the)X
-3727(timings)X
-3996(resulting)X
-4306(from)X
-2706 3212(varying)N
-2973(the)X
-3093(pagesize)X
-3392(from)X
-3570(128)X
-3712(bytes)X
-3903(to)X
-3986(1M)X
-4118(and)X
-4255(the)X
-4374(\256ll)X
-2706 3300(factor)N
-2929(from)X
-3120(1)X
-3195(to)X
-3292(128.)X
-3486(For)X
-3631(each)X
-3813(run,)X
-3974(the)X
-4106(buffer)X
-4337(size)X
-2706 3388(was)N
-2874(set)X
-3006(at)X
-3106(1M.)X
-3299(The)X
-3466(tests)X
-3650(were)X
-3849(all)X
-3971(run)X
-4120(on)X
-4242(an)X
-4360(HP)X
-2706 3476(9000/370)N
-3077(\(33.3)X
-3312(Mhz)X
-3527(MC68030\),)X
-3966(with)X
-4176(16M)X
-4395(of)X
-2706 3564(memory,)N
-3042(64K)X
-3228(physically)X
-3605(addressed)X
-3970(cache,)X
-4222(and)X
-4386(an)X
-2706 3652(HP7959S)N
-3055(disk)X
-3231(drive,)X
-3459(running)X
-3751(4.3BSD-Reno)X
-4244(single-)X
-2706 3740(user.)N
-2878 3854(Both)N
-3066(system)X
-3321(time)X
-3496(\(Figure)X
-3764(5a\))X
-3899(and)X
-4047(elapsed)X
-4320(time)X
-2706 3942(\(Figure)N
-2966(5b\))X
-3097(show)X
-3290(that)X
-3434(for)X
-3552(all)X
-3655(bucket)X
-3892(sizes,)X
-4091(the)X
-4212(greatest)X
-2706 4030(performance)N
-3137(gains)X
-3329(are)X
-3451(made)X
-3648(by)X
-3751(increasing)X
-4104(the)X
-4225(\256ll)X
-4336(fac-)X
-2706 4118(tor)N
-2822(until)X
-2995(equation)X
-3298(1)X
-3365(is)X
-3445(satis\256ed.)X
-3774(The)X
-3925(user)X
-4085(time)X
-4253(shown)X
-2706 4206(in)N
-2791(Figure)X
-3023(5c)X
-3122(gives)X
-3314(a)X
-3373(more)X
-3561(detailed)X
-3838(picture)X
-4083(of)X
-4172(how)X
-4332(per-)X
-2706 4294(formance)N
-3054(varies.)X
-3330(The)X
-3499(smaller)X
-3778(bucket)X
-4035(sizes)X
-4234(require)X
-2706 4382(fewer)N
-2921(keys)X
-3099(per)X
-3233(page)X
-3416(to)X
-3509(satisfy)X
-3749(equation)X
-4056(1)X
-4127(and)X
-4274(there-)X
-2706 4470(fore)N
-2860(incur)X
-3049(fewer)X
-3257(collisions.)X
-3607(However,)X
-3946(when)X
-4144(the)X
-4265(buffer)X
-2706 4558(pool)N
-2884(size)X
-3045(is)X
-3134(\256xed,)X
-3349(smaller)X
-3620(pages)X
-3838(imply)X
-4059(more)X
-4259(pages.)X
-2706 4646(An)N
-2830(increased)X
-3160(number)X
-3430(of)X
-3522(pages)X
-3730(means)X
-3960(more)X
-2 f
-4150(malloc\(3\))X
-1 f
-2706 4734(calls)N
-2879(and)X
-3021(more)X
-3212(overhead)X
-3533(in)X
-3621(the)X
-3745(hash)X
-3918(package's)X
-4265(buffer)X
-2706 4822(manager)N
-3003(to)X
-3085(manage)X
-3355(the)X
-3473(additional)X
-3813(pages.)X
-2878 4936(The)N
-3028(tradeoff)X
-3308(works)X
-3529(out)X
-3655(most)X
-3834(favorably)X
-4166(when)X
-4364(the)X
-2706 5024(page)N
-2886(size)X
-3039(is)X
-3120(256)X
-3268(and)X
-3412(the)X
-3538(\256ll)X
-3654(factor)X
-3870(is)X
-3950(8.)X
-4057(Similar)X
-4319(con-)X
-2706 5112(clusions)N
-3009(were)X
-3207(obtained)X
-3524(if)X
-3614(the)X
-3753(test)X
-3905(was)X
-4071(run)X
-4218(without)X
-2706 5200(knowing)N
-3007(the)X
-3126(\256nal)X
-3289(table)X
-3466(size)X
-3612(in)X
-3695(advance.)X
-4020(If)X
-4095(the)X
-4214(\256le)X
-4337(was)X
-2706 5288(closed)N
-2942(and)X
-3088(written)X
-3345(to)X
-3437(disk,)X
-3620(the)X
-3748(conclusions)X
-4156(were)X
-4343(still)X
-2706 5376(the)N
-2832(same.)X
-3065(However,)X
-3408(rereading)X
-3740(the)X
-3865(\256le)X
-3994(from)X
-4177(disk)X
-4337(was)X
-2706 5464(slightly)N
-2983(faster)X
-3199(if)X
-3285(a)X
-3358(larger)X
-3583(bucket)X
-3834(size)X
-3996(and)X
-4149(\256ll)X
-4274(factor)X
-2706 5552(were)N
-2898(used)X
-3079(\(1K)X
-3238(bucket)X
-3486(size)X
-3645(and)X
-3795(32)X
-3909(\256ll)X
-4031(factor\).)X
-4320(This)X
-2706 5640(follows)N
-2987(intuitively)X
-3356(from)X
-3553(the)X
-3691(improved)X
-4038(ef\256ciency)X
-4395(of)X
-3 f
-720 5960(USENIX)N
-9 f
-1042(-)X
-3 f
-1106(Winter)X
-1371('91)X
-9 f
-1498(-)X
-3 f
-1562(Dallas,)X
-1815(TX)X
-4424(7)X
-
-8 p
-%%Page: 8 8
-0(Courier)xf 0 f
-10 s 10 xH 0 xS 0 f
-3 f
-432 258(A)N
-510(New)X
-682(Hashing)X
-985(Package)X
-1290(for)X
-1413(UNIX)X
-3663(Seltzer)X
-3920(&)X
-4007(Yigit)X
-1 f
-432 538(performing)N
-830(1K)X
-965(reads)X
-1172(from)X
-1365(the)X
-1500(disk)X
-1670(rather)X
-1894(than)X
-2068(256)X
-432 626(byte)N
-609(reads.)X
-857(In)X
-962(general,)X
-1257(performance)X
-1702(for)X
-1834(disk)X
-2005(based)X
-432 714(tables)N
-639(is)X
-712(best)X
-861(when)X
-1055(the)X
-1173(page)X
-1345(size)X
-1490(is)X
-1563(approximately)X
-2046(1K.)X
-10 f
-432 802 -0.0930(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)AN
-619 2380 MXY
--12 24 Dl
-24 0 Dl
--12 -24 Dl
-629 2437 MXY
--12 24 Dl
-24 0 Dl
--12 -24 Dl
-648 2504 MXY
--12 25 Dl
-24 0 Dl
--12 -25 Dl
-686 2515 MXY
--12 24 Dl
-24 0 Dl
--12 -24 Dl
-762 2516 MXY
--12 24 Dl
-25 0 Dl
--13 -24 Dl
-916 2515 MXY
--13 24 Dl
-25 0 Dl
--12 -24 Dl
-1222 2516 MXY
--12 24 Dl
-24 0 Dl
--12 -24 Dl
-1834 2515 MXY
--12 24 Dl
-24 0 Dl
--12 -24 Dl
-1 Dt
-619 2392 MXY
-10 57 Dl
-19 67 Dl
-38 11 Dl
-76 1 Dl
-154 -1 Dl
-306 1 Dl
-612 -1 Dl
-8 s
-1 f
-1628 2522(128)N
-3 Dt
-607 2245 MXY
-24 Dc
-617 2375 MXY
-23 Dc
-635 2442 MXY
-24 Dc
-674 2525 MXY
-23 Dc
-750 2529 MXY
-24 Dc
-904 2527 MXY
-23 Dc
-1210 MX
-23 Dc
-1822 2528 MXY
-23 Dc
-20 Ds
-1 Dt
-619 2245 MXY
-10 130 Dl
-19 67 Dl
-38 83 Dl
-76 4 Dl
-154 -2 Dl
-306 0 Dl
-612 1 Dl
-678 2482(256)N
--1 Ds
-3 Dt
-619 2127 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-629 2191 MXY
-0 25 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-648 2334 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-686 2409 MXY
-0 25 Dl
-0 -13 Dl
-12 0 Dl
--24 0 Dl
-762 2516 MXY
-0 25 Dl
-0 -12 Dl
-13 0 Dl
--25 0 Dl
-916 2516 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--25 0 Dl
-1222 2515 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-1834 2515 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-5 Dt
-619 2139 MXY
-10 65 Dl
-19 142 Dl
-38 75 Dl
-76 108 Dl
-154 -1 Dl
-306 -1 Dl
-612 0 Dl
-694 2401(512)N
-3 Dt
-631 2064 MXY
--24 24 Dl
-12 -12 Dl
--12 -12 Dl
-24 24 Dl
-641 2077 MXY
--24 25 Dl
-12 -12 Dl
--12 -13 Dl
-24 25 Dl
-660 2132 MXY
--24 24 Dl
-12 -12 Dl
--12 -12 Dl
-24 24 Dl
-698 2292 MXY
--24 24 Dl
-12 -12 Dl
--12 -12 Dl
-24 24 Dl
-775 2382 MXY
--25 24 Dl
-12 -12 Dl
--12 -12 Dl
-25 24 Dl
-928 2516 MXY
--25 24 Dl
-13 -12 Dl
--13 -12 Dl
-25 24 Dl
-1234 2516 MXY
--24 25 Dl
-12 -12 Dl
--12 -13 Dl
-24 25 Dl
-1846 2516 MXY
--24 24 Dl
-12 -12 Dl
--12 -12 Dl
-24 24 Dl
-16 Ds
-1 Dt
-619 2076 MXY
-10 14 Dl
-19 54 Dl
-38 160 Dl
-76 90 Dl
-154 134 Dl
-306 1 Dl
-612 -1 Dl
-694 2257(1024)N
--1 Ds
-3 Dt
-619 1877 MXY
-12 -24 Dl
--24 0 Dl
-12 24 Dl
-629 1855 MXY
-12 -24 Dl
--24 0 Dl
-12 24 Dl
-648 1838 MXY
-12 -24 Dl
--24 0 Dl
-12 24 Dl
-686 1860 MXY
-12 -25 Dl
--24 0 Dl
-12 25 Dl
-762 1923 MXY
-13 -24 Dl
--25 0 Dl
-12 24 Dl
-916 2087 MXY
-12 -24 Dl
--25 0 Dl
-13 24 Dl
-1222 2256 MXY
-12 -24 Dl
--24 0 Dl
-12 24 Dl
-1834 2541 MXY
-12 -25 Dl
--24 0 Dl
-12 25 Dl
-619 1865 MXY
-10 -22 Dl
-19 -17 Dl
-38 21 Dl
-76 64 Dl
-154 164 Dl
-306 169 Dl
-612 285 Dl
-1645 2427(4096)N
-619 1243 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-629 1196 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-648 1146 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-686 1174 MXY
-0 25 Dl
-0 -13 Dl
-12 0 Dl
--24 0 Dl
-762 1249 MXY
-0 24 Dl
-0 -12 Dl
-13 0 Dl
--25 0 Dl
-916 1371 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--25 0 Dl
-1222 1680 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-1834 1999 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-619 1255 MXY
-10 -47 Dl
-19 -50 Dl
-38 28 Dl
-76 75 Dl
-154 122 Dl
-306 309 Dl
-612 319 Dl
-1741 1934(8192)N
-5 Dt
-609 2531 MXY
-1225 0 Dl
-609 MX
-0 -1553 Dl
-2531 MY
-0 16 Dl
-4 Ds
-1 Dt
-2531 MY
-0 -1553 Dl
-593 2625(0)N
--1 Ds
-5 Dt
-916 2531 MXY
-0 16 Dl
-4 Ds
-1 Dt
-2531 MY
-0 -1553 Dl
-884 2625(32)N
--1 Ds
-5 Dt
-1222 2531 MXY
-0 16 Dl
-4 Ds
-1 Dt
-2531 MY
-0 -1553 Dl
-1190 2625(64)N
--1 Ds
-5 Dt
-1528 2531 MXY
-0 16 Dl
-4 Ds
-1 Dt
-2531 MY
-0 -1553 Dl
-1496 2625(96)N
--1 Ds
-5 Dt
-1834 2531 MXY
-0 16 Dl
-4 Ds
-1 Dt
-2531 MY
-0 -1553 Dl
-1786 2625(128)N
--1 Ds
-5 Dt
-609 2531 MXY
--16 0 Dl
-4 Ds
-1 Dt
-609 MX
-1225 0 Dl
-545 2558(0)N
--1 Ds
-5 Dt
-609 2013 MXY
--16 0 Dl
-4 Ds
-1 Dt
-609 MX
-1225 0 Dl
-481 2040(100)N
--1 Ds
-5 Dt
-609 1496 MXY
--16 0 Dl
-4 Ds
-1 Dt
-609 MX
-1225 0 Dl
-481 1523(200)N
--1 Ds
-5 Dt
-609 978 MXY
--16 0 Dl
-4 Ds
-1 Dt
-609 MX
-1225 0 Dl
-481 1005(300)N
-1088 2724(Fill)N
-1194(Factor)X
-422 1611(S)N
-426 1667(e)N
-426 1724(c)N
-424 1780(o)N
-424 1837(n)N
-424 1893(d)N
-428 1949(s)N
-3 Dt
--1 Ds
-3 f
-432 2882(Figure)N
-636(5a:)X
-1 f
-744(System)X
-956(Time)X
-1113(for)X
-1209(dictionary)X
-1490(data)X
-1618(set)X
-1711(with)X
-1847(1M)X
-1958(of)X
-2033(buffer)X
-432 2970(space)N
-594(and)X
-707(varying)X
-923(bucket)X
-1114(sizes)X
-1259(and)X
-1372(\256ll)X
-1465(factors.)X
-1675(Each)X
-1823(line)X
-1940(is)X
-2004(labeled)X
-432 3058(with)N
-562(its)X
-639(bucket)X
-825(size.)X
-10 s
-10 f
-432 3234 -0.0930(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)AN
-8 s
-1 f
-428 4381(s)N
-424 4325(d)N
-424 4269(n)N
-424 4212(o)N
-426 4156(c)N
-426 4099(e)N
-422 4043(S)N
-1116 5156(Fill)N
-1222(Factor)X
-506 3437(3200)N
-4 Ds
-1 Dt
-666 3410 MXY
-1168 0 Dl
--1 Ds
-5 Dt
-666 MX
--16 0 Dl
-506 3825(2400)N
-4 Ds
-1 Dt
-666 3799 MXY
-1168 0 Dl
--1 Ds
-5 Dt
-666 MX
--16 0 Dl
-506 4214(1600)N
-4 Ds
-1 Dt
-666 4186 MXY
-1168 0 Dl
--1 Ds
-5 Dt
-666 MX
--16 0 Dl
-538 4602(800)N
-4 Ds
-1 Dt
-666 4575 MXY
-1168 0 Dl
--1 Ds
-5 Dt
-666 MX
--16 0 Dl
-602 4990(0)N
-4 Ds
-1 Dt
-666 4963 MXY
-1168 0 Dl
--1 Ds
-5 Dt
-666 MX
--16 0 Dl
-1786 5057(128)N
-4 Ds
-1 Dt
-1834 4963 MXY
-0 -1553 Dl
--1 Ds
-5 Dt
-4963 MY
-0 16 Dl
-1510 5057(96)N
-4 Ds
-1 Dt
-1542 4963 MXY
-0 -1553 Dl
--1 Ds
-5 Dt
-4963 MY
-0 16 Dl
-1218 5057(64)N
-4 Ds
-1 Dt
-1250 4963 MXY
-0 -1553 Dl
--1 Ds
-5 Dt
-4963 MY
-0 16 Dl
-926 5057(32)N
-4 Ds
-1 Dt
-958 4963 MXY
-0 -1553 Dl
--1 Ds
-5 Dt
-4963 MY
-0 16 Dl
-650 5057(0)N
-4 Ds
-1 Dt
-666 4963 MXY
-0 -1553 Dl
--1 Ds
-5 Dt
-4963 MY
-0 16 Dl
-4963 MY
-0 -1553 Dl
-4963 MY
-1168 0 Dl
-1741 4752(8192)N
-3 Dt
-675 3732 MXY
-9 -172 Dl
-18 -118 Dl
-37 128 Dl
-73 -121 Dl
-146 623 Dl
-292 497 Dl
-584 245 Dl
-4802 MY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-1250 4557 MXY
-0 25 Dl
-0 -13 Dl
-12 0 Dl
--24 0 Dl
-958 4060 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-812 3437 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-739 3558 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-702 3430 MXY
-0 25 Dl
-0 -13 Dl
-13 0 Dl
--25 0 Dl
-684 3548 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-675 3720 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-1637 4912(4096)N
-675 4307 MXY
-9 -58 Dl
-18 30 Dl
-37 89 Dl
-73 144 Dl
-146 235 Dl
-292 122 Dl
-584 89 Dl
-4970 MY
-12 -24 Dl
--24 0 Dl
-12 24 Dl
-1250 4881 MXY
-12 -24 Dl
--24 0 Dl
-12 24 Dl
-958 4759 MXY
-12 -24 Dl
--24 0 Dl
-12 24 Dl
-812 4524 MXY
-12 -24 Dl
--24 0 Dl
-12 24 Dl
-739 4380 MXY
-12 -24 Dl
--24 0 Dl
-12 24 Dl
-702 4291 MXY
-13 -24 Dl
--25 0 Dl
-12 24 Dl
-684 4261 MXY
-12 -24 Dl
--24 0 Dl
-12 24 Dl
-675 4319 MXY
-12 -24 Dl
--24 0 Dl
-12 24 Dl
-734 4662(1024)N
-16 Ds
-1 Dt
-675 4352 MXY
-9 60 Dl
-18 134 Dl
-37 266 Dl
-73 117 Dl
-146 30 Dl
-292 0 Dl
-584 -1 Dl
--1 Ds
-3 Dt
-1846 4946 MXY
--24 24 Dl
-12 -12 Dl
--12 -12 Dl
-24 24 Dl
-1262 4946 MXY
--24 25 Dl
-12 -12 Dl
--12 -13 Dl
-24 25 Dl
-970 4947 MXY
--24 24 Dl
-12 -12 Dl
--12 -12 Dl
-24 24 Dl
-824 4917 MXY
--24 24 Dl
-12 -12 Dl
--12 -12 Dl
-24 24 Dl
-751 4800 MXY
--24 24 Dl
-12 -12 Dl
--12 -12 Dl
-24 24 Dl
-715 4534 MXY
--25 25 Dl
-12 -13 Dl
--12 -12 Dl
-25 25 Dl
-696 4400 MXY
--24 24 Dl
-12 -12 Dl
--12 -12 Dl
-24 24 Dl
-687 4339 MXY
--24 25 Dl
-12 -12 Dl
--12 -13 Dl
-24 25 Dl
-718 4792(512)N
-5 Dt
-675 4422 MXY
-9 137 Dl
-18 278 Dl
-37 105 Dl
-73 18 Dl
-146 -1 Dl
-292 0 Dl
-584 -1 Dl
-3 Dt
-4946 MY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-1250 4946 MXY
-0 25 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-958 4947 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-812 4948 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-739 4930 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-702 4824 MXY
-0 25 Dl
-0 -12 Dl
-13 0 Dl
--25 0 Dl
-684 4547 MXY
-0 24 Dl
-0 -12 Dl
-12 0 Dl
--24 0 Dl
-675 4410 MXY
-0 25 Dl
-0 -13 Dl
-12 0 Dl
--24 0 Dl
-750 4921(256)N
-20 Ds
-1 Dt
-675 4597 MXY
-9 246 Dl
-18 106 Dl
-37 10 Dl
-73 0 Dl
-146 0 Dl
-292 0 Dl
-584 -1 Dl
--1 Ds
-3 Dt
-1822 MX
-23 Dc
-1238 4959 MXY
-23 Dc
-946 MX
-23 Dc
-800 MX
-23 Dc
-727 MX
-23 Dc
-691 4949 MXY
-23 Dc
-672 4843 MXY
-24 Dc
-663 4597 MXY
-24 Dc
-1395 4961(128)N
-1 Dt
-675 4855 MXY
-9 93 Dl
-18 10 Dl
-37 1 Dl
-73 0 Dl
-146 -1 Dl
-292 0 Dl
-584 0 Dl
-3 Dt
-4946 MY
--12 24 Dl
-24 0 Dl
--12 -24 Dl
-1250 MX
--12 24 Dl
-24 0 Dl
--12 -24 Dl
-958 MX
--12 24 Dl
-24 0 Dl
--12 -24 Dl
-812 MX
--12 25 Dl
-24 0 Dl
--12 -25 Dl
-739 4947 MXY
--12 24 Dl
-24 0 Dl
--12 -24 Dl
-702 4946 MXY
--12 24 Dl
-25 0 Dl
--13 -24 Dl
-684 4936 MXY
--12 24 Dl
-24 0 Dl
--12 -24 Dl
-675 4843 MXY
--12 24 Dl
-24 0 Dl
--12 -24 Dl
-3 Dt
--1 Ds
-3 f
-432 5314(Figure)N
-634(5b:)X
-1 f
-744(Elapsed)X
-967(Time)X
-1123(for)X
-1218(dictionary)X
-1498(data)X
-1625(set)X
-1717(with)X
-1851(1M)X
-1960(of)X
-2033(buffer)X
-432 5402(space)N
-593(and)X
-705(varying)X
-920(bucket)X
-1110(sizes)X
-1254(and)X
-1366(\256ll)X
-1457(factors.)X
-1681(Each)X
-1827(line)X
-1942(is)X
-2004(labeled)X
-432 5490(with)N
-562(its)X
-639(bucket)X
-825(size.)X
-10 s
-2590 538(If)N
-2677(an)X
-2785(approximation)X
-3284(of)X
-3383(the)X
-3513(number)X
-3790(of)X
-3889(elements)X
-2418 626(ultimately)N
-2773(to)X
-2866(be)X
-2973(stored)X
-3200(in)X
-3293(the)X
-3422(hash)X
-3599(table)X
-3785(is)X
-3868(known)X
-4116(at)X
-2418 714(the)N
-2564(time)X
-2754(of)X
-2869(creation,)X
-3196(the)X
-3342(hash)X
-3536(package)X
-3847(takes)X
-4059(this)X
-2418 802(number)N
-2688(as)X
-2779(a)X
-2839(parameter)X
-3185(and)X
-3325(uses)X
-3487(it)X
-3555(to)X
-3641(hash)X
-3812(entries)X
-4050(into)X
-2418 890(the)N
-2541(full)X
-2677(sized)X
-2867(table)X
-3048(rather)X
-3261(than)X
-3424(growing)X
-3716(the)X
-3838(table)X
-4018(from)X
-2418 978(a)N
-2477(single)X
-2691(bucket.)X
-2968(If)X
-3044(this)X
-3181(number)X
-3448(is)X
-3523(not)X
-3647(known,)X
-3907(the)X
-4027(hash)X
-2418 1066(table)N
-2632(starts)X
-2859(with)X
-3059(a)X
-3153(single)X
-3402(bucket)X
-3674(and)X
-3848(gracefully)X
-2418 1154(expands)N
-2707(as)X
-2800(elements)X
-3111(are)X
-3236(added,)X
-3474(although)X
-3780(a)X
-3842(slight)X
-4044(per-)X
-2418 1242(formance)N
-2747(degradation)X
-3151(may)X
-3313(be)X
-3413(noticed.)X
-3713(Figure)X
-3946(6)X
-4010(illus-)X
-2418 1330(trates)N
-2625(the)X
-2756(difference)X
-3116(in)X
-3211(performance)X
-3651(between)X
-3952(storing)X
-2418 1418(keys)N
-2588(in)X
-2673(a)X
-2732(\256le)X
-2857(when)X
-3054(the)X
-3174(ultimate)X
-3458(size)X
-3605(is)X
-3680(known)X
-3920(\(the)X
-4067(left)X
-2418 1506(bars)N
-2581(in)X
-2672(each)X
-2849(set\),)X
-3014(compared)X
-3360(to)X
-3450(building)X
-3744(the)X
-3870(\256le)X
-4000(when)X
-2418 1594(the)N
-2550(ultimate)X
-2846(size)X
-3005(is)X
-3091(unknown)X
-3422(\(the)X
-3580(right)X
-3764(bars)X
-3931(in)X
-4026(each)X
-2418 1682(set\).)N
-2609(Once)X
-2814(the)X
-2947(\256ll)X
-3069(factor)X
-3291(is)X
-3378(suf\256ciently)X
-3772(high)X
-3948(for)X
-4076(the)X
-2418 1770(page)N
-2596(size)X
-2747(\(8\),)X
-2887(growing)X
-3180(the)X
-3304(table)X
-3486(dynamically)X
-3908(does)X
-4081(lit-)X
-2418 1858(tle)N
-2518(to)X
-2600(degrade)X
-2875(performance.)X
-10 f
-2418 1946 -0.0930(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)AN
-9 s
-1 f
-2413 3238(s)N
-2409 3173(d)N
-2409 3108(n)N
-2409 3043(o)N
-2411 2979(c)N
-2411 2914(e)N
-2407 2849(S)N
-3143 4129(Fill)N
-3261(Factor)X
-2448 2152(15)N
-4 Ds
-1 Dt
-2557 2122 MXY
-1473 0 Dl
--1 Ds
-5 Dt
-2557 MX
--19 0 Dl
-2448 2747(10)N
-4 Ds
-1 Dt
-2557 2717 MXY
-1473 0 Dl
--1 Ds
-5 Dt
-2557 MX
--19 0 Dl
-2484 3343(5)N
-4 Ds
-1 Dt
-2557 3313 MXY
-1473 0 Dl
--1 Ds
-5 Dt
-2557 MX
--19 0 Dl
-2484 3938(0)N
-4 Ds
-1 Dt
-2557 3908 MXY
-1473 0 Dl
--1 Ds
-5 Dt
-2557 MX
--19 0 Dl
-3976 4015(128)N
-4 Ds
-1 Dt
-4030 3908 MXY
-0 -1786 Dl
--1 Ds
-5 Dt
-3908 MY
-0 19 Dl
-3626 4015(96)N
-4 Ds
-1 Dt
-3662 3908 MXY
-0 -1786 Dl
--1 Ds
-5 Dt
-3908 MY
-0 19 Dl
-3258 4015(64)N
-4 Ds
-1 Dt
-3294 3908 MXY
-0 -1786 Dl
--1 Ds
-5 Dt
-3908 MY
-0 19 Dl
-2889 4015(32)N
-4 Ds
-1 Dt
-2925 3908 MXY
-0 -1786 Dl
--1 Ds
-5 Dt
-3908 MY
-0 19 Dl
-2539 4015(0)N
-4 Ds
-1 Dt
-2557 3908 MXY
-0 -1786 Dl
--1 Ds
-5 Dt
-3908 MY
-0 19 Dl
-3908 MY
-0 -1786 Dl
-3908 MY
-1473 0 Dl
-4053 2378(8192)N
-3 Dt
-2569 2277 MXY
-11 0 Dl
-23 48 Dl
-46 -167 Dl
-92 35 Dl
-184 12 Dl
-369 143 Dl
-736 0 Dl
-2334 MY
-0 28 Dl
-0 -14 Dl
-14 0 Dl
--28 0 Dl
-3294 2334 MXY
-0 28 Dl
-0 -14 Dl
-13 0 Dl
--27 0 Dl
-2925 2192 MXY
-0 27 Dl
-0 -14 Dl
-14 0 Dl
--28 0 Dl
-2741 2180 MXY
-0 27 Dl
-0 -14 Dl
-14 0 Dl
--28 0 Dl
-2649 2144 MXY
-0 28 Dl
-0 -14 Dl
-14 0 Dl
--28 0 Dl
-2603 2311 MXY
-0 27 Dl
-0 -13 Dl
-14 0 Dl
--28 0 Dl
-2580 2263 MXY
-0 28 Dl
-0 -14 Dl
-14 0 Dl
--28 0 Dl
-2569 2263 MXY
-0 28 Dl
-0 -14 Dl
-13 0 Dl
--27 0 Dl
-4053 2591(4096)N
-2569 2348 MXY
-11 -11 Dl
-23 -96 Dl
-46 71 Dl
-92 72 Dl
-184 226 Dl
-369 48 Dl
-736 -60 Dl
-2612 MY
-14 -28 Dl
--28 0 Dl
-14 28 Dl
-3294 2672 MXY
-13 -28 Dl
--27 0 Dl
-14 28 Dl
-2925 2624 MXY
-14 -28 Dl
--28 0 Dl
-14 28 Dl
-2741 2398 MXY
-14 -28 Dl
--28 0 Dl
-14 28 Dl
-2649 2326 MXY
-14 -27 Dl
--28 0 Dl
-14 27 Dl
-2603 2255 MXY
-14 -28 Dl
--28 0 Dl
-14 28 Dl
-2580 2350 MXY
-14 -27 Dl
--28 0 Dl
-14 27 Dl
-2569 2362 MXY
-13 -28 Dl
--27 0 Dl
-14 28 Dl
-4053 2681(1024)N
-16 Ds
-1 Dt
-2569 2300 MXY
-11 48 Dl
-23 96 Dl
-46 95 Dl
-92 274 Dl
-184 202 Dl
-369 -155 Dl
-736 -190 Dl
--1 Ds
-3 Dt
-4044 2656 MXY
--28 28 Dl
-14 -14 Dl
--14 -14 Dl
-28 28 Dl
-3307 2846 MXY
--27 28 Dl
-14 -14 Dl
--14 -14 Dl
-27 28 Dl
-2939 3001 MXY
--28 28 Dl
-14 -14 Dl
--14 -14 Dl
-28 28 Dl
-2755 2799 MXY
--28 28 Dl
-14 -14 Dl
--14 -14 Dl
-28 28 Dl
-2663 2525 MXY
--28 28 Dl
-14 -14 Dl
--14 -14 Dl
-28 28 Dl
-2617 2430 MXY
--28 28 Dl
-14 -14 Dl
--14 -14 Dl
-28 28 Dl
-2594 2334 MXY
--28 28 Dl
-14 -14 Dl
--14 -14 Dl
-28 28 Dl
-2582 2287 MXY
--27 27 Dl
-14 -14 Dl
--14 -13 Dl
-27 27 Dl
-4053 2851(512)N
-5 Dt
-2569 2372 MXY
-11 -24 Dl
-23 405 Dl
-46 83 Dl
-92 227 Dl
-184 -72 Dl
-369 -119 Dl
-736 -107 Dl
-3 Dt
-2751 MY
-0 28 Dl
-0 -14 Dl
-14 0 Dl
--28 0 Dl
-3294 2858 MXY
-0 28 Dl
-0 -14 Dl
-13 0 Dl
--27 0 Dl
-2925 2977 MXY
-0 28 Dl
-0 -14 Dl
-14 0 Dl
--28 0 Dl
-2741 3049 MXY
-0 27 Dl
-0 -13 Dl
-14 0 Dl
--28 0 Dl
-2649 2823 MXY
-0 27 Dl
-0 -14 Dl
-14 0 Dl
--28 0 Dl
-2603 2739 MXY
-0 28 Dl
-0 -14 Dl
-14 0 Dl
--28 0 Dl
-2580 2334 MXY
-0 28 Dl
-0 -14 Dl
-14 0 Dl
--28 0 Dl
-2569 2358 MXY
-0 28 Dl
-0 -14 Dl
-13 0 Dl
--27 0 Dl
-4053 2795(256)N
-20 Ds
-1 Dt
-2569 2456 MXY
-11 285 Dl
-23 95 Dl
-46 251 Dl
-92 -60 Dl
-184 -84 Dl
-369 -107 Dl
-736 -71 Dl
--1 Ds
-3 Dt
-4016 MX
-27 Dc
-3280 2836 MXY
-27 Dc
-2912 2943 MXY
-27 Dc
-2728 3027 MXY
-27 Dc
-2635 3087 MXY
-28 Dc
-2589 2836 MXY
-28 Dc
-2566 2741 MXY
-27 Dc
-2554 2456 MXY
-28 Dc
-4053 2741(128)N
-1 Dt
-2569 2729 MXY
-11 203 Dl
-23 131 Dl
-46 -60 Dl
-92 -119 Dl
-184 -60 Dl
-369 -83 Dl
-736 -12 Dl
-3 Dt
-2716 MY
--14 27 Dl
-28 0 Dl
--14 -27 Dl
-3294 2727 MXY
--14 28 Dl
-27 0 Dl
--13 -28 Dl
-2925 2811 MXY
--14 27 Dl
-28 0 Dl
--14 -27 Dl
-2741 2870 MXY
--14 28 Dl
-28 0 Dl
--14 -28 Dl
-2649 2989 MXY
--14 28 Dl
-28 0 Dl
--14 -28 Dl
-2603 3049 MXY
--14 27 Dl
-28 0 Dl
--14 -27 Dl
-2580 2918 MXY
--14 28 Dl
-28 0 Dl
--14 -28 Dl
-2569 2716 MXY
--14 27 Dl
-27 0 Dl
--13 -27 Dl
-3 Dt
--1 Ds
-3 f
-8 s
-2418 4286(Figure)N
-2628(5c:)X
-1 f
-2738(User)X
-2887(Time)X
-3051(for)X
-3154(dictionary)X
-3442(data)X
-3577(set)X
-3677(with)X
-3820(1M)X
-3938(of)X
-4019(buffer)X
-2418 4374(space)N
-2579(and)X
-2691(varying)X
-2906(bucket)X
-3096(sizes)X
-3240(and)X
-3352(\256ll)X
-3443(factors.)X
-3667(Each)X
-3813(line)X
-3928(is)X
-3990(labeled)X
-2418 4462(with)N
-2548(its)X
-2625(bucket)X
-2811(size.)X
-10 s
-10 f
-2418 4638 -0.0930(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)AN
-1 f
-2590 4840(Since)N
-2796(no)X
-2904(known)X
-3150(hash)X
-3325(function)X
-3620(performs)X
-3938(equally)X
-2418 4928(well)N
-2589(on)X
-2702(all)X
-2815(possible)X
-3110(data,)X
-3297(the)X
-3428(user)X
-3595(may)X
-3766(\256nd)X
-3923(that)X
-4076(the)X
-2418 5016(built-in)N
-2678(hash)X
-2849(function)X
-3140(does)X
-3311(poorly)X
-3544(on)X
-3648(a)X
-3708(particular)X
-4040(data)X
-2418 5104(set.)N
-2548(In)X
-2636(this)X
-2771(case,)X
-2950(a)X
-3006(hash)X
-3173(function,)X
-3480(taking)X
-3700(two)X
-3840(arguments)X
-2418 5192(\(a)N
-2507(pointer)X
-2760(to)X
-2848(a)X
-2910(byte)X
-3074(string)X
-3282(and)X
-3424(a)X
-3486(length\))X
-3739(and)X
-3880(returning)X
-2418 5280(an)N
-2517(unsigned)X
-2829(long)X
-2993(to)X
-3077(be)X
-3175(used)X
-3344(as)X
-3433(the)X
-3553(hash)X
-3722(value,)X
-3938(may)X
-4098(be)X
-2418 5368(speci\256ed)N
-2731(at)X
-2817(hash)X
-2992(table)X
-3176(creation)X
-3463(time.)X
-3673(When)X
-3893(an)X
-3996(exist-)X
-2418 5456(ing)N
-2570(hash)X
-2767(table)X
-2973(is)X
-3076(opened)X
-3358(and)X
-3524(a)X
-3609(hash)X
-3805(function)X
-4121(is)X
-2418 5544(speci\256ed,)N
-2752(the)X
-2879(hash)X
-3054(package)X
-3346(will)X
-3498(try)X
-3615(to)X
-3705(determine)X
-4054(that)X
-2418 5632(the)N
-2546(hash)X
-2723(function)X
-3020(supplied)X
-3321(is)X
-3404(the)X
-3532(one)X
-3678(with)X
-3850(which)X
-4076(the)X
-2418 5720(table)N
-2630(was)X
-2811(created.)X
-3139(There)X
-3382(are)X
-3536(a)X
-3627(variety)X
-3905(of)X
-4027(hash)X
-3 f
-432 5960(8)N
-2970(USENIX)X
-9 f
-3292(-)X
-3 f
-3356(Winter)X
-3621('91)X
-9 f
-3748(-)X
-3 f
-3812(Dallas,)X
-4065(TX)X
-
-9 p
-%%Page: 9 9
-0(Courier)xf 0 f
-10 s 10 xH 0 xS 0 f
-3 f
-720 258(Seltzer)N
-977(&)X
-1064(Yigit)X
-3278(A)X
-3356(New)X
-3528(Hashing)X
-3831(Package)X
-4136(for)X
-4259(UNIX)X
-1 f
-720 538(functions)N
-1065(provided)X
-1397(with)X
-1586(the)X
-1731(package.)X
-2082(The)X
-2253(default)X
-720 626(function)N
-1014(for)X
-1135(the)X
-1260(package)X
-1551(is)X
-1631(the)X
-1755(one)X
-1897(which)X
-2119(offered)X
-2378(the)X
-720 714(best)N
-875(performance)X
-1308(in)X
-1396(terms)X
-1600(of)X
-1693(cycles)X
-1920(executed)X
-2232(per)X
-2360(call)X
-720 802(\(it)N
-827(did)X
-965(not)X
-1103(produce)X
-1398(the)X
-1531(fewest)X
-1776(collisions)X
-2117(although)X
-2432(it)X
-720 890(was)N
-866(within)X
-1091(a)X
-1148(small)X
-1341(percentage)X
-1710(of)X
-1797(the)X
-1915(function)X
-2202(that)X
-2342(pro-)X
-720 978(duced)N
-947(the)X
-1080(fewest)X
-1324(collisions\).)X
-1731(Again,)X
-1981(in)X
-2077(time)X
-2253(critical)X
-720 1066(applications,)N
-1152(users)X
-1342(are)X
-1466(encouraged)X
-1862(to)X
-1949(experiment)X
-2334(with)X
-720 1154(a)N
-783(variety)X
-1032(of)X
-1125(hash)X
-1298(functions)X
-1622(to)X
-1710(achieve)X
-1982(optimal)X
-2252(perfor-)X
-720 1242(mance.)N
-10 f
-720 1330 -0.0930(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)AN
-3 f
-7 s
-1038 2925(Full)N
-1149(size)X
-1251(table)X
-1384(\(left\))X
-1547 2718(Fill)N
-1643(Factor)X
-2268 2662(64)N
-1964(32)X
-1674(16)X
-1384(8)X
-1093(4)X
-4 Ds
-1 Dt
-900 2280 MXY
-1548 0 Dl
-900 1879 MXY
-1548 0 Dl
-900 1506 MXY
-1548 0 Dl
-1563 2902 MXY
-111 0 Dl
--1 Ds
-900 MX
-110 0 Dl
-1425 2828(System)N
-983(User)X
-1895 2778 MXY
- 1895 2778 lineto
- 1950 2778 lineto
- 1950 2833 lineto
- 1895 2833 lineto
- 1895 2778 lineto
-closepath 21 1895 2778 1950 2833 Dp
-1342 MX
- 1342 2778 lineto
- 1397 2778 lineto
- 1397 2833 lineto
- 1342 2833 lineto
- 1342 2778 lineto
-closepath 14 1342 2778 1397 2833 Dp
-900 MX
- 900 2778 lineto
- 955 2778 lineto
- 955 2833 lineto
- 900 2833 lineto
- 900 2778 lineto
-closepath 3 900 2778 955 2833 Dp
-5 Dt
-2283 2211 MXY
-96 0 Dl
-1992 MX
-97 0 Dl
-1702 MX
-97 0 Dl
-1411 2252 MXY
-97 0 Dl
-4 Ds
-1 Dt
-2283 2211 MXY
- 2283 2211 lineto
- 2379 2211 lineto
- 2379 2252 lineto
- 2283 2252 lineto
- 2283 2211 lineto
-closepath 14 2283 2211 2379 2252 Dp
-1992 MX
- 1992 2211 lineto
- 2089 2211 lineto
- 2089 2252 lineto
- 1992 2252 lineto
- 1992 2211 lineto
-closepath 14 1992 2211 2089 2252 Dp
-1702 MX
- 1702 2211 lineto
- 1799 2211 lineto
- 1799 2252 lineto
- 1702 2252 lineto
- 1702 2211 lineto
-closepath 14 1702 2211 1799 2252 Dp
-1411 2252 MXY
- 1411 2252 lineto
- 1508 2252 lineto
- 1508 2294 lineto
- 1411 2294 lineto
- 1411 2252 lineto
-closepath 14 1411 2252 1508 2294 Dp
-2283 MX
- 2283 2252 lineto
- 2379 2252 lineto
- 2379 2612 lineto
- 2283 2612 lineto
- 2283 2252 lineto
-closepath 3 2283 2252 2379 2612 Dp
-1992 MX
- 1992 2252 lineto
- 2089 2252 lineto
- 2089 2612 lineto
- 1992 2612 lineto
- 1992 2252 lineto
-closepath 3 1992 2252 2089 2612 Dp
-1702 MX
- 1702 2252 lineto
- 1799 2252 lineto
- 1799 2612 lineto
- 1702 2612 lineto
- 1702 2252 lineto
-closepath 3 1702 2252 1799 2612 Dp
-1411 2294 MXY
- 1411 2294 lineto
- 1508 2294 lineto
- 1508 2612 lineto
- 1411 2612 lineto
- 1411 2294 lineto
-closepath 3 1411 2294 1508 2612 Dp
--1 Ds
-2158 2238 MXY
- 2158 2238 lineto
- 2255 2238 lineto
- 2255 2252 lineto
- 2158 2252 lineto
- 2158 2238 lineto
-closepath 21 2158 2238 2255 2252 Dp
-1868 MX
- 1868 2238 lineto
- 1965 2238 lineto
- 1965 2280 lineto
- 1868 2280 lineto
- 1868 2238 lineto
-closepath 21 1868 2238 1965 2280 Dp
-1577 MX
- 1577 2238 lineto
- 1674 2238 lineto
- 1674 2308 lineto
- 1577 2308 lineto
- 1577 2238 lineto
-closepath 21 1577 2238 1674 2308 Dp
-1287 2308 MXY
- 1287 2308 lineto
- 1287 2280 lineto
- 1384 2280 lineto
- 1384 2308 lineto
- 1287 2308 lineto
-closepath 21 1287 2280 1384 2308 Dp
-2158 2280 MXY
- 2158 2280 lineto
- 2158 2252 lineto
- 2255 2252 lineto
- 2255 2280 lineto
- 2158 2280 lineto
-closepath 14 2158 2252 2255 2280 Dp
-1868 2308 MXY
- 1868 2308 lineto
- 1868 2280 lineto
- 1965 2280 lineto
- 1965 2308 lineto
- 1868 2308 lineto
-closepath 14 1868 2280 1965 2308 Dp
-1577 2335 MXY
- 1577 2335 lineto
- 1577 2308 lineto
- 1674 2308 lineto
- 1674 2335 lineto
- 1577 2335 lineto
-closepath 14 1577 2308 1674 2335 Dp
-1287 2363 MXY
- 1287 2363 lineto
- 1287 2308 lineto
- 1384 2308 lineto
- 1384 2363 lineto
- 1287 2363 lineto
-closepath 14 1287 2308 1384 2363 Dp
-2158 2280 MXY
- 2158 2280 lineto
- 2255 2280 lineto
- 2255 2612 lineto
- 2158 2612 lineto
- 2158 2280 lineto
-closepath 3 2158 2280 2255 2612 Dp
-1868 2308 MXY
- 1868 2308 lineto
- 1965 2308 lineto
- 1965 2612 lineto
- 1868 2612 lineto
- 1868 2308 lineto
-closepath 3 1868 2308 1965 2612 Dp
-1577 2335 MXY
- 1577 2335 lineto
- 1674 2335 lineto
- 1674 2612 lineto
- 1577 2612 lineto
- 1577 2335 lineto
-closepath 3 1577 2335 1674 2612 Dp
-1287 2363 MXY
- 1287 2363 lineto
- 1384 2363 lineto
- 1384 2612 lineto
- 1287 2612 lineto
- 1287 2363 lineto
-closepath 3 1287 2363 1384 2612 Dp
-4 Ds
-1121 2066 MXY
- 1121 2066 lineto
- 1218 2066 lineto
- 1224 2080 lineto
- 1127 2080 lineto
- 1121 2066 lineto
-closepath 21 1121 2066 1224 2080 Dp
-2080 MY
- 1121 2080 lineto
- 1218 2080 lineto
- 1218 2273 lineto
- 1121 2273 lineto
- 1121 2080 lineto
-closepath 14 1121 2080 1218 2273 Dp
-2273 MY
- 1121 2273 lineto
- 1218 2273 lineto
- 1218 2612 lineto
- 1121 2612 lineto
- 1121 2273 lineto
-closepath 3 1121 2273 1218 2612 Dp
--1 Ds
-997 1589 MXY
- 997 1589 lineto
- 1093 1589 lineto
- 1093 1644 lineto
- 997 1644 lineto
- 997 1589 lineto
-closepath 21 997 1589 1093 1644 Dp
-1644 MY
- 997 1644 lineto
- 1093 1644 lineto
- 1093 2280 lineto
- 997 2280 lineto
- 997 1644 lineto
-closepath 14 997 1644 1093 2280 Dp
-2280 MY
- 997 2280 lineto
- 1093 2280 lineto
- 1093 2612 lineto
- 997 2612 lineto
- 997 2280 lineto
-closepath 3 997 2280 1093 2612 Dp
-10 s
-719 2093(s)N
-712 2037(d)N
-712 1982(n)N
-714 1927(o)N
-716 1872(c)N
-716 1816(e)N
-712 1761(S)N
-804 2286(10)N
-804 1899(20)N
-804 1540(30)N
-3 Dt
-900 1506 MXY
-0 1106 Dl
-1548 0 Dl
-7 s
-1978 2828(Elapsed)N
-1701 2925(Dynamically)N
-2018(grown)X
-2184(table)X
-2317(\(right\))X
-3 Dt
--1 Ds
-8 s
-720 3180(Figure)N
-934(6:)X
-1 f
-1020(The)X
-1152(total)X
-1299(regions)X
-1520(indicate)X
-1755(the)X
-1865(difference)X
-2154(between)X
-2398(the)X
-720 3268(elapsed)N
-931(time)X
-1065(and)X
-1177(the)X
-1275(sum)X
-1402(of)X
-1475(the)X
-1573(system)X
-1771(and)X
-1883(user)X
-2008(time.)X
-2173(The)X
-2291(left)X
-2395(bar)X
-720 3356(of)N
-798(each)X
-939(set)X
-1035(depicts)X
-1241(the)X
-1344(timing)X
-1537(of)X
-1615(the)X
-1718(test)X
-1831(run)X
-1940(when)X
-2102(the)X
-2204(number)X
-2423(of)X
-720 3444(entries)N
-910(is)X
-973(known)X
-1167(in)X
-1237(advance.)X
-1496(The)X
-1614(right)X
-1754(bars)X
-1879(depict)X
-2054(the)X
-2151(timing)X
-2338(when)X
-720 3532(the)N
-814(\256le)X
-912(is)X
-971(grown)X
-1150(from)X
-1290(a)X
-1334(single)X
-1503(bucket.)X
-10 s
-10 f
-720 3708 -0.0930(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)AN
-1 f
-892 3910(Since)N
-1131(this)X
-1307(hashing)X
-1617(package)X
-1942(provides)X
-2279(buffer)X
-720 3998(management,)N
-1188(the)X
-1323(amount)X
-1600(of)X
-1704(space)X
-1920(allocated)X
-2247(for)X
-2378(the)X
-720 4086(buffer)N
-948(pool)X
-1121(may)X
-1290(be)X
-1397(speci\256ed)X
-1713(by)X
-1824(the)X
-1953(user.)X
-2157(Using)X
-2378(the)X
-720 4174(same)N
-910(data)X
-1069(set)X
-1183(and)X
-1324(test)X
-1459(procedure)X
-1805(as)X
-1896(used)X
-2067(to)X
-2153(derive)X
-2378(the)X
-720 4262(graphs)N
-962(in)X
-1052(Figures)X
-1320(5a-c,)X
-1507(Figure)X
-1744(7)X
-1812(shows)X
-2039(the)X
-2164(impact)X
-2409(of)X
-720 4350(varying)N
-997(the)X
-1126(size)X
-1282(of)X
-1380(the)X
-1509(buffer)X
-1737(pool.)X
-1950(The)X
-2106(bucket)X
-2351(size)X
-720 4438(was)N
-873(set)X
-989(to)X
-1078(256)X
-1225(bytes)X
-1421(and)X
-1564(the)X
-1689(\256ll)X
-1804(factor)X
-2019(was)X
-2171(set)X
-2287(to)X
-2376(16.)X
-720 4526(The)N
-869(buffer)X
-1090(pool)X
-1256(size)X
-1404(was)X
-1552(varied)X
-1776(from)X
-1955(0)X
-2018(\(the)X
-2166(minimum)X
-720 4614(number)N
-986(of)X
-1074(pages)X
-1277(required)X
-1565(to)X
-1647(be)X
-1743(buffered\))X
-2063(to)X
-2145(1M.)X
-2316(With)X
-720 4702(1M)N
-854(of)X
-944(buffer)X
-1164(space,)X
-1386(the)X
-1507(package)X
-1794(performed)X
-2151(no)X
-2253(I/O)X
-2382(for)X
-720 4790(this)N
-871(data)X
-1040(set.)X
-1204(As)X
-1328(Figure)X
-1572(7)X
-1647(illustrates,)X
-2013(increasing)X
-2378(the)X
-720 4878(buffer)N
-944(pool)X
-1113(size)X
-1265(can)X
-1404(have)X
-1583(a)X
-1646(dramatic)X
-1954(affect)X
-2165(on)X
-2271(result-)X
-720 4966(ing)N
-842(performance.)X
-2 f
-8 s
-1269 4941(7)N
-1 f
-16 s
-720 5353 MXY
-864 0 Dl
-2 f
-8 s
-760 5408(7)N
-1 f
-9 s
-826 5433(Some)N
-1024(allocators)X
-1338(are)X
-1460(extremely)X
-1782(inef\256cient)X
-2107(at)X
-2192(allocating)X
-720 5513(memory.)N
-1029(If)X
-1110(you)X
-1251(\256nd)X
-1396(that)X
-1536(applications)X
-1916(are)X
-2036(running)X
-2292(out)X
-2416(of)X
-720 5593(memory)N
-1005(before)X
-1234(you)X
-1386(think)X
-1578(they)X
-1746(should,)X
-2000(try)X
-2124(varying)X
-2388(the)X
-720 5673(pagesize)N
-986(to)X
-1060(get)X
-1166(better)X
-1348(utilization)X
-1658(from)X
-1816(the)X
-1922(memory)X
-2180(allocator.)X
-10 s
-2830 1975 MXY
-0 -28 Dl
-28 0 Dl
-0 28 Dl
--28 0 Dl
-2853 2004 MXY
-0 -27 Dl
-28 0 Dl
-0 27 Dl
--28 0 Dl
-2876 2016 MXY
-0 -27 Dl
-27 0 Dl
-0 27 Dl
--27 0 Dl
-2922 1998 MXY
-0 -27 Dl
-27 0 Dl
-0 27 Dl
--27 0 Dl
-2967 2025 MXY
-0 -28 Dl
-28 0 Dl
-0 28 Dl
--28 0 Dl
-3013 2031 MXY
-0 -28 Dl
-28 0 Dl
-0 28 Dl
--28 0 Dl
-3059 MX
-0 -28 Dl
-27 0 Dl
-0 28 Dl
--27 0 Dl
-3196 2052 MXY
-0 -28 Dl
-27 0 Dl
-0 28 Dl
--27 0 Dl
-3561 2102 MXY
-0 -28 Dl
-28 0 Dl
-0 28 Dl
--28 0 Dl
-4292 2105 MXY
-0 -28 Dl
-27 0 Dl
-0 28 Dl
--27 0 Dl
-4 Ds
-1 Dt
-2844 1961 MXY
-23 30 Dl
-23 12 Dl
-45 -18 Dl
-46 26 Dl
-46 6 Dl
-45 0 Dl
-137 21 Dl
-366 50 Dl
-730 3 Dl
-9 s
-4227 2158(User)N
--1 Ds
-3 Dt
-2830 1211 MXY
-27 Dc
-2853 1261 MXY
-27 Dc
-2876 1267 MXY
-27 Dc
-2921 1341 MXY
-27 Dc
-2967 1385 MXY
-27 Dc
-3013 1450 MXY
-27 Dc
-3059 1497 MXY
-27 Dc
-3196 1686 MXY
-27 Dc
-3561 2109 MXY
-27 Dc
-4292 2295 MXY
-27 Dc
-20 Ds
-1 Dt
-2844 1211 MXY
-23 50 Dl
-23 6 Dl
-45 74 Dl
-46 44 Dl
-46 65 Dl
-45 47 Dl
-137 189 Dl
-366 423 Dl
-730 186 Dl
-4181 2270(System)N
--1 Ds
-3 Dt
-2844 583 MXY
-0 28 Dl
-0 -14 Dl
-14 0 Dl
--28 0 Dl
-2867 672 MXY
-0 27 Dl
-0 -14 Dl
-14 0 Dl
--28 0 Dl
-2890 701 MXY
-0 28 Dl
-0 -14 Dl
-13 0 Dl
--27 0 Dl
-2935 819 MXY
-0 28 Dl
-0 -14 Dl
-14 0 Dl
--27 0 Dl
-2981 849 MXY
-0 28 Dl
-0 -14 Dl
-14 0 Dl
--28 0 Dl
-3027 908 MXY
-0 27 Dl
-0 -13 Dl
-14 0 Dl
--28 0 Dl
-3072 1026 MXY
-0 27 Dl
-0 -13 Dl
-14 0 Dl
--27 0 Dl
-3209 1292 MXY
-0 27 Dl
-0 -14 Dl
-14 0 Dl
--27 0 Dl
-3575 1823 MXY
-0 28 Dl
-0 -14 Dl
-14 0 Dl
--28 0 Dl
-4305 2059 MXY
-0 28 Dl
-0 -14 Dl
-14 0 Dl
--27 0 Dl
-5 Dt
-2844 597 MXY
-23 88 Dl
-23 30 Dl
-45 118 Dl
-46 30 Dl
-46 59 Dl
-45 118 Dl
-137 265 Dl
-366 532 Dl
-730 236 Dl
-4328 2103(Total)N
-2844 2310 MXY
-1461 0 Dl
-2844 MX
-0 -1772 Dl
-2310 MY
-0 18 Dl
-4 Ds
-1 Dt
-2310 MY
-0 -1772 Dl
-2826 2416(0)N
--1 Ds
-5 Dt
-3209 2310 MXY
-0 18 Dl
-4 Ds
-1 Dt
-2310 MY
-0 -1772 Dl
-3155 2416(256)N
--1 Ds
-5 Dt
-3575 2310 MXY
-0 18 Dl
-4 Ds
-1 Dt
-2310 MY
-0 -1772 Dl
-3521 2416(512)N
--1 Ds
-5 Dt
-3940 2310 MXY
-0 18 Dl
-4 Ds
-1 Dt
-2310 MY
-0 -1772 Dl
-3886 2416(768)N
--1 Ds
-5 Dt
-4305 2310 MXY
-0 18 Dl
-4 Ds
-1 Dt
-2310 MY
-0 -1772 Dl
-4233 2416(1024)N
--1 Ds
-5 Dt
-2844 2310 MXY
--18 0 Dl
-4 Ds
-1 Dt
-2844 MX
-1461 0 Dl
-2771 2340(0)N
--1 Ds
-5 Dt
-2844 2014 MXY
--18 0 Dl
-2844 1719 MXY
--18 0 Dl
-4 Ds
-1 Dt
-2844 MX
-1461 0 Dl
-2735 1749(20)N
--1 Ds
-5 Dt
-2844 1423 MXY
--18 0 Dl
-2844 1128 MXY
--18 0 Dl
-4 Ds
-1 Dt
-2844 MX
-1461 0 Dl
-2735 1158(40)N
--1 Ds
-5 Dt
-2844 833 MXY
--18 0 Dl
-2844 538 MXY
--18 0 Dl
-4 Ds
-1 Dt
-2844 MX
-1461 0 Dl
-2735 568(60)N
-3239 2529(Buffer)N
-3445(Pool)X
-3595(Size)X
-3737(\(in)X
-3835(K\))X
-2695 1259(S)N
-2699 1324(e)N
-2699 1388(c)N
-2697 1452(o)N
-2697 1517(n)N
-2697 1581(d)N
-2701 1645(s)N
-3 Dt
--1 Ds
-3 f
-8 s
-2706 2773(Figure)N
-2908(7:)X
-1 f
-2982(User)X
-3123(time)X
-3258(is)X
-3322(virtually)X
-3560(insensitive)X
-3854(to)X
-3924(the)X
-4022(amount)X
-4234(of)X
-4307(buffer)X
-2706 2861(pool)N
-2852(available,)X
-3130(however,)X
-3396(both)X
-3541(system)X
-3750(time)X
-3895(and)X
-4018(elapsed)X
-4240(time)X
-4385(are)X
-2706 2949(inversely)N
-2960(proportional)X
-3296(to)X
-3366(the)X
-3464(size)X
-3583(of)X
-3656(the)X
-3753(buffer)X
-3927(pool.)X
-4092(Even)X
-4242(for)X
-4335(large)X
-2706 3037(data)N
-2831(sets)X
-2946(where)X
-3120(one)X
-3230(expects)X
-3439(few)X
-3552(collisions,)X
-3832(specifying)X
-4116(a)X
-4162(large)X
-4307(buffer)X
-2706 3125(pool)N
-2836(dramatically)X
-3171(improves)X
-3425(performance.)X
-10 s
-10 f
-2706 3301 -0.0930(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)AN
-3 f
-3175 3543(Enhanced)N
-3536(Functionality)X
-1 f
-2878 3675(This)N
-3046(hashing)X
-3320(package)X
-3609(provides)X
-3910(a)X
-3971(set)X
-4085(of)X
-4177(compati-)X
-2706 3763(bility)N
-2895(routines)X
-3174(to)X
-3257(implement)X
-3620(the)X
-2 f
-3739(ndbm)X
-1 f
-3937(interface.)X
-4279(How-)X
-2706 3851(ever,)N
-2893(when)X
-3095(the)X
-3220(native)X
-3443(interface)X
-3752(is)X
-3832(used,)X
-4026(the)X
-4151(following)X
-2706 3939(additional)N
-3046(functionality)X
-3475(is)X
-3548(provided:)X
-10 f
-2798 4071(g)N
-1 f
-2946(Inserts)X
-3197(never)X
-3413(fail)X
-3556(because)X
-3847(too)X
-3985(many)X
-4199(keys)X
-2946 4159(hash)N
-3113(to)X
-3195(the)X
-3313(same)X
-3498(value.)X
-10 f
-2798 4247(g)N
-1 f
-2946(Inserts)X
-3187(never)X
-3393(fail)X
-3527(because)X
-3808(key)X
-3950(and/or)X
-4181(asso-)X
-2946 4335(ciated)N
-3158(data)X
-3312(is)X
-3385(too)X
-3507(large)X
-10 f
-2798 4423(g)N
-1 f
-2946(Hash)X
-3131(functions)X
-3449(may)X
-3607(be)X
-3703(user-speci\256ed.)X
-10 f
-2798 4511(g)N
-1 f
-2946(Multiple)X
-3268(pages)X
-3498(may)X
-3683(be)X
-3806(cached)X
-4077(in)X
-4186(main)X
-2946 4599(memory.)N
-2706 4731(It)N
-2801(also)X
-2976(provides)X
-3298(a)X
-3380(set)X
-3514(of)X
-3626(compatibility)X
-4097(routines)X
-4400(to)X
-2706 4819(implement)N
-3087(the)X
-2 f
-3224(hsearch)X
-1 f
-3516(interface.)X
-3876(Again,)X
-4130(the)X
-4266(native)X
-2706 4907(interface)N
-3008(offers)X
-3216(enhanced)X
-3540(functionality:)X
-10 f
-2798 5039(g)N
-1 f
-2946(Files)X
-3121(may)X
-3279(grow)X
-3464(beyond)X
-2 f
-3720(nelem)X
-1 f
-3932(elements.)X
-10 f
-2798 5127(g)N
-1 f
-2946(Multiple)X
-3247(hash)X
-3420(tables)X
-3632(may)X
-3795(be)X
-3896(accessed)X
-4203(con-)X
-2946 5215(currently.)N
-10 f
-2798 5303(g)N
-1 f
-2946(Hash)X
-3134(tables)X
-3344(may)X
-3505(be)X
-3604(stored)X
-3823(and)X
-3962(accessed)X
-4266(on)X
-2946 5391(disk.)N
-10 f
-2798 5479(g)N
-1 f
-2946(Hash)X
-3155(functions)X
-3497(may)X
-3679(be)X
-3799(user-speci\256ed)X
-4288(at)X
-2946 5567(runtime.)N
-3 f
-720 5960(USENIX)N
-9 f
-1042(-)X
-3 f
-1106(Winter)X
-1371('91)X
-9 f
-1498(-)X
-3 f
-1562(Dallas,)X
-1815(TX)X
-4424(9)X
-
-10 p
-%%Page: 10 10
-0(Courier)xf 0 f
-10 s 10 xH 0 xS 0 f
-3 f
-432 258(A)N
-510(New)X
-682(Hashing)X
-985(Package)X
-1290(for)X
-1413(UNIX)X
-3663(Seltzer)X
-3920(&)X
-4007(Yigit)X
-459 538(Relative)N
-760(Performance)X
-1227(of)X
-1314(the)X
-1441(New)X
-1613(Implementation)X
-1 f
-604 670(The)N
-761(performance)X
-1200(testing)X
-1445(of)X
-1544(the)X
-1674(new)X
-1840(package)X
-2135(is)X
-432 758(divided)N
-711(into)X
-874(two)X
-1033(test)X
-1183(suites.)X
-1424(The)X
-1588(\256rst)X
-1751(suite)X
-1941(of)X
-2046(tests)X
-432 846(requires)N
-727(that)X
-882(the)X
-1015(tables)X
-1237(be)X
-1348(read)X
-1522(from)X
-1713(and)X
-1864(written)X
-2126(to)X
-432 934(disk.)N
-640(In)X
-742(these)X
-942(tests,)X
-1139(the)X
-1272(basis)X
-1467(for)X
-1595(comparison)X
-2003(is)X
-2090(the)X
-432 1022(4.3BSD-Reno)N
-908(version)X
-1169(of)X
-2 f
-1260(ndbm)X
-1 f
-1438(.)X
-1502(Based)X
-1722(on)X
-1826(the)X
-1948(designs)X
-432 1110(of)N
-2 f
-521(sdbm)X
-1 f
-712(and)X
-2 f
-850(gdbm)X
-1 f
-1028(,)X
-1070(they)X
-1230(are)X
-1351(expected)X
-1659(to)X
-1743(perform)X
-2024(simi-)X
-432 1198(larly)N
-605(to)X
-2 f
-693(ndbm)X
-1 f
-871(,)X
-917(and)X
-1059(we)X
-1179(do)X
-1285(not)X
-1413(show)X
-1608(their)X
-1781(performance)X
-432 1286(numbers.)N
-800(The)X
-977(second)X
-1252(suite)X
-1454(contains)X
-1772(the)X
-1921(memory)X
-432 1374(resident)N
-712(test)X
-849(which)X
-1071(does)X
-1243(not)X
-1370(require)X
-1623(that)X
-1768(the)X
-1891(\256les)X
-2049(ever)X
-432 1462(be)N
-533(written)X
-784(to)X
-870(disk,)X
-1047(only)X
-1213(that)X
-1357(hash)X
-1528(tables)X
-1739(may)X
-1901(be)X
-2001(mani-)X
-432 1550(pulated)N
-692(in)X
-778(main)X
-961(memory.)X
-1291(In)X
-1381(this)X
-1519(test,)X
-1673(we)X
-1790(compare)X
-2090(the)X
-432 1638(performance)N
-859(to)X
-941(that)X
-1081(of)X
-1168(the)X
-2 f
-1286(hsearch)X
-1 f
-1560(routines.)X
-604 1752(For)N
-760(both)X
-947(suites,)X
-1194(two)X
-1358(different)X
-1679(databases)X
-2031(were)X
-432 1840(used.)N
-656(The)X
-818(\256rst)X
-979(is)X
-1069(the)X
-1204(dictionary)X
-1566(database)X
-1880(described)X
-432 1928(previously.)N
-836(The)X
-987(second)X
-1236(was)X
-1386(constructed)X
-1781(from)X
-1962(a)X
-2023(pass-)X
-432 2016(word)N
-647(\256le)X
-799(with)X
-990(approximately)X
-1502(300)X
-1671(accounts.)X
-2041(Two)X
-432 2104(records)N
-700(were)X
-887(constructed)X
-1287(for)X
-1411(each)X
-1589(account.)X
-1909(The)X
-2064(\256rst)X
-432 2192(used)N
-604(the)X
-727(logname)X
-1028(as)X
-1120(the)X
-1243(key)X
-1384(and)X
-1525(the)X
-1648(remainder)X
-1999(of)X
-2090(the)X
-432 2280(password)N
-768(entry)X
-965(for)X
-1091(the)X
-1221(data.)X
-1427(The)X
-1584(second)X
-1839(was)X
-1996(keyed)X
-432 2368(by)N
-541(uid)X
-672(and)X
-817(contained)X
-1157(the)X
-1283(entire)X
-1494(password)X
-1825(entry)X
-2018(as)X
-2113(its)X
-432 2456(data)N
-589(\256eld.)X
-794(The)X
-942(tests)X
-1107(were)X
-1287(all)X
-1389(run)X
-1518(on)X
-1620(the)X
-1740(HP)X
-1864(9000)X
-2046(with)X
-432 2544(the)N
-574(same)X
-783(con\256guration)X
-1254(previously)X
-1636(described.)X
-2027(Each)X
-432 2632(test)N
-576(was)X
-734(run)X
-874(\256ve)X
-1027(times)X
-1232(and)X
-1380(the)X
-1510(timing)X
-1750(results)X
-1991(of)X
-2090(the)X
-432 2720(runs)N
-602(were)X
-791(averaged.)X
-1154(The)X
-1311(variance)X
-1616(across)X
-1849(the)X
-1979(5)X
-2050(runs)X
-432 2808(was)N
-591(approximately)X
-1088(1%)X
-1229(of)X
-1330(the)X
-1462(average)X
-1746(yielding)X
-2041(95%)X
-432 2896(con\256dence)N
-800(intervals)X
-1096(of)X
-1183(approximately)X
-1666(2%.)X
-3 f
-1021 3050(Disk)N
-1196(Based)X
-1420(Tests)X
-1 f
-604 3182(In)N
-693(these)X
-880(tests,)X
-1064(we)X
-1180(use)X
-1308(a)X
-1365(bucket)X
-1600(size)X
-1746(of)X
-1834(1024)X
-2015(and)X
-2152(a)X
-432 3270(\256ll)N
-540(factor)X
-748(of)X
-835(32.)X
-3 f
-432 3384(create)N
-663(test)X
-1 f
-547 3498(The)N
-703(keys)X
-881(are)X
-1011(entered)X
-1279(into)X
-1433(the)X
-1561(hash)X
-1738(table,)X
-1944(and)X
-2090(the)X
-547 3586(\256le)N
-669(is)X
-742(\257ushed)X
-993(to)X
-1075(disk.)X
-3 f
-432 3700(read)N
-608(test)X
-1 f
-547 3814(A)N
-640(lookup)X
-897(is)X
-984(performed)X
-1353(for)X
-1481(each)X
-1663(key)X
-1813(in)X
-1909(the)X
-2041(hash)X
-547 3902(table.)N
-3 f
-432 4016(verify)N
-653(test)X
-1 f
-547 4130(A)N
-640(lookup)X
-897(is)X
-984(performed)X
-1353(for)X
-1481(each)X
-1663(key)X
-1813(in)X
-1909(the)X
-2041(hash)X
-547 4218(table,)N
-759(and)X
-911(the)X
-1045(data)X
-1215(returned)X
-1519(is)X
-1608(compared)X
-1961(against)X
-547 4306(that)N
-687(originally)X
-1018(stored)X
-1234(in)X
-1316(the)X
-1434(hash)X
-1601(table.)X
-3 f
-432 4420(sequential)N
-798(retrieve)X
-1 f
-547 4534(All)N
-674(keys)X
-846(are)X
-970(retrieved)X
-1281(in)X
-1367(sequential)X
-1716(order)X
-1910(from)X
-2090(the)X
-547 4622(hash)N
-724(table.)X
-950(The)X
-2 f
-1105(ndbm)X
-1 f
-1313(interface)X
-1625(allows)X
-1863(sequential)X
-547 4710(retrieval)N
-848(of)X
-948(the)X
-1079(keys)X
-1259(from)X
-1448(the)X
-1578(database,)X
-1907(but)X
-2041(does)X
-547 4798(not)N
-701(return)X
-945(the)X
-1094(data)X
-1279(associated)X
-1660(with)X
-1853(each)X
-2052(key.)X
-547 4886(Therefore,)N
-929(we)X
-1067(compare)X
-1388(the)X
-1530(performance)X
-1980(of)X
-2090(the)X
-547 4974(new)N
-703(package)X
-989(to)X
-1073(two)X
-1215(different)X
-1514(runs)X
-1674(of)X
-2 f
-1763(ndbm)X
-1 f
-1941(.)X
-2002(In)X
-2090(the)X
-547 5062(\256rst)N
-697(case,)X
-2 f
-882(ndbm)X
-1 f
-1086(returns)X
-1335(only)X
-1503(the)X
-1627(keys)X
-1800(while)X
-2003(in)X
-2090(the)X
-547 5150(second,)N
-2 f
-823(ndbm)X
-1 f
-1034(returns)X
-1290(both)X
-1465(the)X
-1596(keys)X
-1776(and)X
-1924(the)X
-2054(data)X
-547 5238(\(requiring)N
-894(a)X
-956(second)X
-1204(call)X
-1345(to)X
-1432(the)X
-1555(library\).)X
-1861(There)X
-2074(is)X
-2152(a)X
-547 5326(single)N
-764(run)X
-897(for)X
-1017(the)X
-1141(new)X
-1300(library)X
-1539(since)X
-1729(it)X
-1798(returns)X
-2046(both)X
-547 5414(the)N
-665(key)X
-801(and)X
-937(the)X
-1055(data.)X
-3 f
-3014 538(In-Memory)N
-3431(Test)X
-1 f
-2590 670(This)N
-2757(test)X
-2892(uses)X
-3054(a)X
-3114(bucket)X
-3352(size)X
-3501(of)X
-3592(256)X
-3736(and)X
-3876(a)X
-3936(\256ll)X
-4048(fac-)X
-2418 758(tor)N
-2527(of)X
-2614(8.)X
-3 f
-2418 872(create/read)N
-2827(test)X
-1 f
-2533 986(In)N
-2627(this)X
-2769(test,)X
-2927(a)X
-2989(hash)X
-3162(table)X
-3344(is)X
-3423(created)X
-3682(by)X
-3788(inserting)X
-4094(all)X
-2533 1074(the)N
-2660(key/data)X
-2961(pairs.)X
-3186(Then)X
-3380(a)X
-3445(keyed)X
-3666(retrieval)X
-3963(is)X
-4044(per-)X
-2533 1162(formed)N
-2801(for)X
-2931(each)X
-3115(pair,)X
-3295(and)X
-3446(the)X
-3579(hash)X
-3761(table)X
-3952(is)X
-4040(des-)X
-2533 1250(troyed.)N
-3 f
-2938 1404(Performance)N
-3405(Results)X
-1 f
-2590 1536(Figures)N
-2866(8a)X
-2978(and)X
-3130(8b)X
-3246(show)X
-3451(the)X
-3585(user)X
-3755(time,)X
-3952(system)X
-2418 1624(time,)N
-2608(and)X
-2752(elapsed)X
-3021(time)X
-3191(for)X
-3312(each)X
-3487(test)X
-3625(for)X
-3746(both)X
-3915(the)X
-4040(new)X
-2418 1712(implementation)N
-2951(and)X
-3098(the)X
-3227(old)X
-3360(implementation)X
-3893(\()X
-2 f
-3920(hsearch)X
-1 f
-2418 1800(or)N
-2 f
-2528(ndbm)X
-1 f
-2706(,)X
-2769(whichever)X
-3147(is)X
-3243(appropriate\))X
-3678(as)X
-3787(well)X
-3967(as)X
-4076(the)X
-2418 1888(improvement.)N
-2929(The)X
-3098(improvement)X
-3569(is)X
-3666(expressed)X
-4027(as)X
-4138(a)X
-2418 1976(percentage)N
-2787(of)X
-2874(the)X
-2992(old)X
-3114(running)X
-3383(time:)X
-0 f
-8 s
-2418 2275(%)N
-2494(=)X
-2570(100)X
-2722(*)X
-2798 -0.4219(\(old_time)AX
-3178(-)X
-3254 -0.4219(new_time\))AX
-3634(/)X
-3710(old_time)X
-1 f
-10 s
-2590 2600(In)N
-2700(nearly)X
-2944(all)X
-3067(cases,)X
-3299(the)X
-3439(new)X
-3615(routines)X
-3915(perform)X
-2418 2688(better)N
-2628(than)X
-2793(the)X
-2918(old)X
-3047(routines)X
-3332(\(both)X
-2 f
-3527(hsearch)X
-1 f
-3807(and)X
-2 f
-3949(ndbm)X
-1 f
-4127(\).)X
-2418 2776(Although)N
-2755(the)X
-3 f
-2888(create)X
-1 f
-3134(tests)X
-3311(exhibit)X
-3567(superior)X
-3864(user)X
-4032(time)X
-2418 2864(performance,)N
-2869(the)X
-2991(test)X
-3126(time)X
-3292(is)X
-3369(dominated)X
-3731(by)X
-3834(the)X
-3955(cost)X
-4107(of)X
-2418 2952(writing)N
-2677(the)X
-2803(actual)X
-3023(\256le)X
-3153(to)X
-3243(disk.)X
-3444(For)X
-3583(the)X
-3709(large)X
-3897(database)X
-2418 3040(\(the)N
-2564(dictionary\),)X
-2957(this)X
-3093(completely)X
-3470(overwhelmed)X
-3927(the)X
-4045(sys-)X
-2418 3128(tem)N
-2570(time.)X
-2783(However,)X
-3129(for)X
-3254(the)X
-3383(small)X
-3587(data)X
-3752(base,)X
-3946(we)X
-4071(see)X
-2418 3216(that)N
-2569(differences)X
-2958(in)X
-3051(both)X
-3224(user)X
-3389(and)X
-3536(system)X
-3788(time)X
-3960(contri-)X
-2418 3304(bute)N
-2576(to)X
-2658(the)X
-2776(superior)X
-3059(performance)X
-3486(of)X
-3573(the)X
-3691(new)X
-3845(package.)X
-2590 3418(The)N
-3 f
-2764(read)X
-1 f
-2920(,)X
-3 f
-2989(verify)X
-1 f
-3190(,)X
-3259(and)X
-3 f
-3424(sequential)X
-1 f
-3818(results)X
-4075(are)X
-2418 3506(deceptive)N
-2758(for)X
-2883(the)X
-3012(small)X
-3216(database)X
-3524(since)X
-3720(the)X
-3849(entire)X
-4063(test)X
-2418 3594(ran)N
-2551(in)X
-2643(under)X
-2856(a)X
-2922(second.)X
-3215(However,)X
-3560(on)X
-3669(the)X
-3796(larger)X
-4013(data-)X
-2418 3682(base)N
-2590(the)X
-3 f
-2716(read)X
-1 f
-2900(and)X
-3 f
-3044(verify)X
-1 f
-3273(tests)X
-3443(bene\256t)X
-3689(from)X
-3873(the)X
-3999(cach-)X
-2418 3770(ing)N
-2546(of)X
-2639(buckets)X
-2910(in)X
-2998(the)X
-3122(new)X
-3282(package)X
-3571(to)X
-3658(improve)X
-3950(perfor-)X
-2418 3858(mance)N
-2666(by)X
-2784(over)X
-2965(80%.)X
-3169(Since)X
-3384(the)X
-3519(\256rst)X
-3 f
-3680(sequential)X
-1 f
-4063(test)X
-2418 3946(does)N
-2598(not)X
-2733(require)X
-2 f
-2994(ndbm)X
-1 f
-3205(to)X
-3299(return)X
-3523(the)X
-3653(data)X
-3819(values,)X
-4076(the)X
-2418 4034(user)N
-2573(time)X
-2735(is)X
-2808(lower)X
-3011(than)X
-3169(for)X
-3283(the)X
-3401(new)X
-3555(package.)X
-3879(However)X
-2418 4122(when)N
-2613(we)X
-2728(require)X
-2977(both)X
-3139(packages)X
-3454(to)X
-3536(return)X
-3748(data,)X
-3922(the)X
-4040(new)X
-2418 4210(package)N
-2702(excels)X
-2923(in)X
-3005(all)X
-3105(three)X
-3286(timings.)X
-2590 4324(The)N
-2773(small)X
-3003(database)X
-3337(runs)X
-3532(so)X
-3660(quickly)X
-3957(in)X
-4076(the)X
-2418 4412(memory-resident)N
-3000(case)X
-3173(that)X
-3326(the)X
-3457(results)X
-3699(are)X
-3831(uninterest-)X
-2418 4500(ing.)N
-2589(However,)X
-2933(for)X
-3056(the)X
-3183(larger)X
-3400(database)X
-3706(the)X
-3833(new)X
-3995(pack-)X
-2418 4588(age)N
-2567(pays)X
-2751(a)X
-2824(small)X
-3033(penalty)X
-3305(in)X
-3403(system)X
-3661(time)X
-3839(because)X
-4130(it)X
-2418 4676(limits)N
-2636(its)X
-2748(main)X
-2944(memory)X
-3247(utilization)X
-3607(and)X
-3759(swaps)X
-3991(pages)X
-2418 4764(out)N
-2550(to)X
-2642(temporary)X
-3002(storage)X
-3264(in)X
-3356(the)X
-3484(\256le)X
-3616(system)X
-3868(while)X
-4076(the)X
-2 f
-2418 4852(hsearch)N
-1 f
-2698(package)X
-2988(requires)X
-3273(that)X
-3419(the)X
-3543(application)X
-3924(allocate)X
-2418 4940(enough)N
-2692(space)X
-2909(for)X
-3041(all)X
-3159(key/data)X
-3468(pair.)X
-3670(However,)X
-4022(even)X
-2418 5028(with)N
-2600(the)X
-2738(system)X
-3000(time)X
-3182(penalty,)X
-3477(the)X
-3614(resulting)X
-3933(elapsed)X
-2418 5116(time)N
-2580(improves)X
-2898(by)X
-2998(over)X
-3161(50%.)X
-3 f
-432 5960(10)N
-2970(USENIX)X
-9 f
-3292(-)X
-3 f
-3356(Winter)X
-3621('91)X
-9 f
-3748(-)X
-3 f
-3812(Dallas,)X
-4065(TX)X
-
-11 p
-%%Page: 11 11
-0(Courier)xf 0 f
-10 s 10 xH 0 xS 0 f
-3 f
-720 258(Seltzer)N
-977(&)X
-1064(Yigit)X
-3278(A)X
-3356(New)X
-3528(Hashing)X
-3831(Package)X
-4136(for)X
-4259(UNIX)X
-1 f
-10 f
-908 454(i)N
-927(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-2 f
-1379 546(hash)N
-1652(ndbm)X
-1950(%change)X
-1 f
-10 f
-908 550(i)N
-927(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-948 642(CREATE)N
-10 f
-908 646(i)N
-927(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-1125 738(user)N
-1424(6.4)X
-1671(12.2)X
-2073(48)X
-1157 826(sys)N
-1384(32.5)X
-1671(34.7)X
-2113(6)X
-3 f
-1006 914(elapsed)N
-10 f
-1310 922(c)N
-890(c)Y
-810(c)Y
-730(c)Y
-3 f
-1384 914(90.4)N
-10 f
-1581 922(c)N
-890(c)Y
-810(c)Y
-730(c)Y
-3 f
-1671 914(99.6)N
-10 f
-1883 922(c)N
-890(c)Y
-810(c)Y
-730(c)Y
-3 f
-2113 914(9)N
-1 f
-10 f
-908 910(i)N
-927(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-908 926(i)N
-927(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-948 1010(READ)N
-10 f
-908 1014(i)N
-927(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-1125 1106(user)N
-1424(3.4)X
-1711(6.1)X
-2073(44)X
-1157 1194(sys)N
-1424(1.2)X
-1671(15.3)X
-2073(92)X
-3 f
-1006 1282(elapsed)N
-10 f
-1310 1290(c)N
-1258(c)Y
-1178(c)Y
-1098(c)Y
-3 f
-1424 1282(4.0)N
-10 f
-1581 1290(c)N
-1258(c)Y
-1178(c)Y
-1098(c)Y
-3 f
-1671 1282(21.2)N
-10 f
-1883 1290(c)N
-1258(c)Y
-1178(c)Y
-1098(c)Y
-3 f
-2073 1282(81)N
-1 f
-10 f
-908 1278(i)N
-927(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-908 1294(i)N
-927(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-948 1378(VERIFY)N
-10 f
-908 1382(i)N
-927(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-1125 1474(user)N
-1424(3.5)X
-1711(6.3)X
-2073(44)X
-1157 1562(sys)N
-1424(1.2)X
-1671(15.3)X
-2073(92)X
-3 f
-1006 1650(elapsed)N
-10 f
-1310 1658(c)N
-1626(c)Y
-1546(c)Y
-1466(c)Y
-3 f
-1424 1650(4.0)N
-10 f
-1581 1658(c)N
-1626(c)Y
-1546(c)Y
-1466(c)Y
-3 f
-1671 1650(21.2)N
-10 f
-1883 1658(c)N
-1626(c)Y
-1546(c)Y
-1466(c)Y
-3 f
-2073 1650(81)N
-1 f
-10 f
-908 1646(i)N
-927(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-908 1662(i)N
-927(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-948 1746(SEQUENTIAL)N
-10 f
-908 1750(i)N
-927(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-1125 1842(user)N
-1424(2.7)X
-1711(1.9)X
-2046(-42)X
-1157 1930(sys)N
-1424(0.7)X
-1711(3.9)X
-2073(82)X
-3 f
-1006 2018(elapsed)N
-10 f
-1310 2026(c)N
-1994(c)Y
-1914(c)Y
-1834(c)Y
-3 f
-1424 2018(3.0)N
-10 f
-1581 2026(c)N
-1994(c)Y
-1914(c)Y
-1834(c)Y
-3 f
-1711 2018(5.0)N
-10 f
-1883 2026(c)N
-1994(c)Y
-1914(c)Y
-1834(c)Y
-3 f
-2073 2018(40)N
-1 f
-10 f
-908 2014(i)N
-927(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-908 2030(i)N
-927(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-948 2114(SEQUENTIAL)N
-1467(\(with)X
-1656(data)X
-1810(retrieval\))X
-10 f
-908 2118(i)N
-927(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-1125 2210(user)N
-1424(2.7)X
-1711(8.2)X
-2073(67)X
-1157 2298(sys)N
-1424(0.7)X
-1711(4.3)X
-2073(84)X
-3 f
-1006 2386(elapsed)N
-1424(3.0)X
-1671(12.0)X
-2073(75)X
-1 f
-10 f
-908 2390(i)N
-927(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-899 2394(c)N
-2378(c)Y
-2298(c)Y
-2218(c)Y
-2138(c)Y
-2058(c)Y
-1978(c)Y
-1898(c)Y
-1818(c)Y
-1738(c)Y
-1658(c)Y
-1578(c)Y
-1498(c)Y
-1418(c)Y
-1338(c)Y
-1258(c)Y
-1178(c)Y
-1098(c)Y
-1018(c)Y
-938(c)Y
-858(c)Y
-778(c)Y
-698(c)Y
-618(c)Y
-538(c)Y
-1310 2394(c)N
-2362(c)Y
-2282(c)Y
-2202(c)Y
-1581 2394(c)N
-2362(c)Y
-2282(c)Y
-2202(c)Y
-1883 2394(c)N
-2362(c)Y
-2282(c)Y
-2202(c)Y
-2278 2394(c)N
-2378(c)Y
-2298(c)Y
-2218(c)Y
-2138(c)Y
-2058(c)Y
-1978(c)Y
-1898(c)Y
-1818(c)Y
-1738(c)Y
-1658(c)Y
-1578(c)Y
-1498(c)Y
-1418(c)Y
-1338(c)Y
-1258(c)Y
-1178(c)Y
-1098(c)Y
-1018(c)Y
-938(c)Y
-858(c)Y
-778(c)Y
-698(c)Y
-618(c)Y
-538(c)Y
-905 2574(i)N
-930(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-2 f
-1318 2666(hash)N
-1585(hsearch)X
-1953(%change)X
-1 f
-10 f
-905 2670(i)N
-930(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-945 2762(CREATE/READ)N
-10 f
-905 2766(i)N
-930(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-1064 2858(user)N
-1343(6.6)X
-1642(17.2)X
-2096(62)X
-1096 2946(sys)N
-1343(1.1)X
-1682(0.3)X
-2029(-266)X
-3 f
-945 3034(elapsed)N
-1343(7.8)X
-1642(17.0)X
-2096(54)X
-1 f
-10 f
-905 3038(i)N
-930(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-896 3050(c)N
-2978(c)Y
-2898(c)Y
-2818(c)Y
-2738(c)Y
-2658(c)Y
-1249 3034(c)N
-3010(c)Y
-2930(c)Y
-2850(c)Y
-1520 3034(c)N
-3010(c)Y
-2930(c)Y
-2850(c)Y
-1886 3034(c)N
-3010(c)Y
-2930(c)Y
-2850(c)Y
-2281 3050(c)N
-2978(c)Y
-2898(c)Y
-2818(c)Y
-2738(c)Y
-2658(c)Y
-3 f
-720 3174(Figure)N
-967(8a:)X
-1 f
-1094(Timing)X
-1349(results)X
-1578(for)X
-1692(the)X
-1810(dictionary)X
-2155(database.)X
-10 f
-720 3262 -0.0930(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)AN
-3 f
-1407 3504(Conclusion)N
-1 f
-892 3636(This)N
-1063(paper)X
-1271(has)X
-1407(presented)X
-1744(the)X
-1871(design,)X
-2129(implemen-)X
-720 3724(tation)N
-928(and)X
-1070(performance)X
-1503(of)X
-1596(a)X
-1658(new)X
-1818(hashing)X
-2093(package)X
-2382(for)X
-720 3812(UNIX.)N
-993(The)X
-1150(new)X
-1316(package)X
-1612(provides)X
-1919(a)X
-1986(superset)X
-2280(of)X
-2378(the)X
-720 3900(functionality)N
-1159(of)X
-1255(existing)X
-1537(hashing)X
-1815(packages)X
-2139(and)X
-2284(incor-)X
-720 3988(porates)N
-975(additional)X
-1318(features)X
-1596(such)X
-1766(as)X
-1855(large)X
-2038(key)X
-2176(handling,)X
-720 4076(user)N
-876(de\256ned)X
-1134(hash)X
-1302(functions,)X
-1641(multiple)X
-1928(hash)X
-2096(tables,)X
-2324(vari-)X
-720 4164(able)N
-894(sized)X
-1099(pages,)X
-1342(and)X
-1498(linear)X
-1721(hashing.)X
-2050(In)X
-2156(nearly)X
-2396(all)X
-720 4252(cases,)N
-954(the)X
-1096(new)X
-1274(package)X
-1582(provides)X
-1902(improved)X
-2252(perfor-)X
-720 4340(mance)N
-974(on)X
-1098(the)X
-1240(order)X
-1454(of)X
-1565(50-80%)X
-1863(for)X
-2001(the)X
-2142(workloads)X
-720 4428(shown.)N
-990(Applications)X
-1420(such)X
-1588(as)X
-1676(the)X
-1794(loader,)X
-2035(compiler,)X
-2360(and)X
-720 4516(mail,)N
-921(which)X
-1156(currently)X
-1485(implement)X
-1866(their)X
-2051(own)X
-2227(hashing)X
-720 4604(routines,)N
-1032(should)X
-1279(be)X
-1389(modi\256ed)X
-1706(to)X
-1801(use)X
-1941(the)X
-2072(generic)X
-2342(rou-)X
-720 4692(tines.)N
-892 4806(This)N
-1087(hashing)X
-1389(package)X
-1705(is)X
-1810(one)X
-1978(access)X
-2236(method)X
-720 4894(which)N
-953(is)X
-1043(part)X
-1205(of)X
-1309(a)X
-1382(generic)X
-1656(database)X
-1970(access)X
-2212(package)X
-720 4982(being)N
-955(developed)X
-1342(at)X
-1457(the)X
-1612(University)X
-2007(of)X
-2131(California,)X
-720 5070(Berkeley.)N
-1089(It)X
-1177(will)X
-1340(include)X
-1614(a)X
-1688(btree)X
-1887(access)X
-2131(method)X
-2409(as)X
-720 5158(well)N
-916(as)X
-1041(\256xed)X
-1259(and)X
-1433(variable)X
-1750(length)X
-2007(record)X
-2270(access)X
-720 5246(methods)N
-1024(in)X
-1119(addition)X
-1414(to)X
-1509(the)X
-1640(hashed)X
-1896(support)X
-2168(presented)X
-720 5334(here.)N
-948(All)X
-1099(of)X
-1215(the)X
-1361(access)X
-1615(methods)X
-1934(are)X
-2081(based)X
-2312(on)X
-2440(a)X
-720 5422(key/data)N
-1037(pair)X
-1207(interface)X
-1533(and)X
-1693(appear)X
-1952(identical)X
-2272(to)X
-2378(the)X
-720 5510(application)N
-1121(layer,)X
-1347(allowing)X
-1671(application)X
-2071(implementa-)X
-720 5598(tions)N
-906(to)X
-999(be)X
-1106(largely)X
-1360(independent)X
-1783(of)X
-1881(the)X
-2010(database)X
-2318(type.)X
-720 5686(The)N
-873(package)X
-1165(is)X
-1246(expected)X
-1560(to)X
-1650(be)X
-1754(an)X
-1858(integral)X
-2131(part)X
-2284(of)X
-2378(the)X
-2706 538(4.4BSD)N
-3006(system,)X
-3293(with)X
-3479(various)X
-3759(standard)X
-4075(applications)X
-2706 626(such)N
-2879(as)X
-2972(more\(1\),)X
-3277(sort\(1\))X
-3517(and)X
-3659(vi\(1\))X
-3841(based)X
-4050(on)X
-4156(it.)X
-4266(While)X
-2706 714(the)N
-2833(current)X
-3089(design)X
-3326(does)X
-3501(not)X
-3631(support)X
-3899(multi-user)X
-4256(access)X
-2706 802(or)N
-2804(transactions,)X
-3238(they)X
-3407(could)X
-3616(be)X
-3723(incorporated)X
-4159(relatively)X
-2706 890(easily.)N
-10 f
-2894 938(i)N
-2913(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-2 f
-3365 1030(hash)N
-3638(ndbm)X
-3936(%change)X
-1 f
-10 f
-2894 1034(i)N
-2913(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-2934 1126(CREATE)N
-10 f
-2894 1130(i)N
-2913(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-3111 1222(user)N
-3390(0.2)X
-3677(0.4)X
-4079(50)X
-3143 1310(sys)N
-3390(0.1)X
-3677(1.0)X
-4079(90)X
-3 f
-2992 1398(elapsed)N
-10 f
-3296 1406(c)N
-1374(c)Y
-1294(c)Y
-1214(c)Y
-3 f
-3390 1398(0)N
-10 f
-3567 1406(c)N
-1374(c)Y
-1294(c)Y
-1214(c)Y
-3 f
-3677 1398(3.2)N
-10 f
-3869 1406(c)N
-1374(c)Y
-1294(c)Y
-1214(c)Y
-3 f
-4039 1398(100)N
-1 f
-10 f
-2894 1394(i)N
-2913(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-2894 1410(i)N
-2913(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-2934 1494(READ)N
-10 f
-2894 1498(i)N
-2913(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-3111 1590(user)N
-3390(0.1)X
-3677(0.1)X
-4119(0)X
-3143 1678(sys)N
-3390(0.1)X
-3677(0.4)X
-4079(75)X
-3 f
-2992 1766(elapsed)N
-10 f
-3296 1774(c)N
-1742(c)Y
-1662(c)Y
-1582(c)Y
-3 f
-3390 1766(0.0)N
-10 f
-3567 1774(c)N
-1742(c)Y
-1662(c)Y
-1582(c)Y
-3 f
-3677 1766(0.0)N
-10 f
-3869 1774(c)N
-1742(c)Y
-1662(c)Y
-1582(c)Y
-3 f
-4119 1766(0)N
-1 f
-10 f
-2894 1762(i)N
-2913(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-2894 1778(i)N
-2913(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-2934 1862(VERIFY)N
-10 f
-2894 1866(i)N
-2913(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-3111 1958(user)N
-3390(0.1)X
-3677(0.2)X
-4079(50)X
-3143 2046(sys)N
-3390(0.1)X
-3677(0.3)X
-4079(67)X
-3 f
-2992 2134(elapsed)N
-10 f
-3296 2142(c)N
-2110(c)Y
-2030(c)Y
-1950(c)Y
-3 f
-3390 2134(0.0)N
-10 f
-3567 2142(c)N
-2110(c)Y
-2030(c)Y
-1950(c)Y
-3 f
-3677 2134(0.0)N
-10 f
-3869 2142(c)N
-2110(c)Y
-2030(c)Y
-1950(c)Y
-3 f
-4119 2134(0)N
-1 f
-10 f
-2894 2130(i)N
-2913(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-2894 2146(i)N
-2913(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-2934 2230(SEQUENTIAL)N
-10 f
-2894 2234(i)N
-2913(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-3111 2326(user)N
-3390(0.1)X
-3677(0.0)X
-4012(-100)X
-3143 2414(sys)N
-3390(0.1)X
-3677(0.1)X
-4119(0)X
-3 f
-2992 2502(elapsed)N
-10 f
-3296 2510(c)N
-2478(c)Y
-2398(c)Y
-2318(c)Y
-3 f
-3390 2502(0.0)N
-10 f
-3567 2510(c)N
-2478(c)Y
-2398(c)Y
-2318(c)Y
-3 f
-3677 2502(0.0)N
-10 f
-3869 2510(c)N
-2478(c)Y
-2398(c)Y
-2318(c)Y
-3 f
-4119 2502(0)N
-1 f
-10 f
-2894 2498(i)N
-2913(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-2894 2514(i)N
-2913(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-2934 2598(SEQUENTIAL)N
-3453(\(with)X
-3642(data)X
-3796(retrieval\))X
-10 f
-2894 2602(i)N
-2913(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-3111 2694(user)N
-3390(0.1)X
-3677(0.1)X
-4119(0)X
-3143 2782(sys)N
-3390(0.1)X
-3677(0.1)X
-4119(0)X
-3 f
-2992 2870(elapsed)N
-3390(0.0)X
-3677(0.0)X
-4119(0)X
-1 f
-10 f
-2894 2874(i)N
-2913(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-2885 2878(c)N
-2862(c)Y
-2782(c)Y
-2702(c)Y
-2622(c)Y
-2542(c)Y
-2462(c)Y
-2382(c)Y
-2302(c)Y
-2222(c)Y
-2142(c)Y
-2062(c)Y
-1982(c)Y
-1902(c)Y
-1822(c)Y
-1742(c)Y
-1662(c)Y
-1582(c)Y
-1502(c)Y
-1422(c)Y
-1342(c)Y
-1262(c)Y
-1182(c)Y
-1102(c)Y
-1022(c)Y
-3296 2878(c)N
-2846(c)Y
-2766(c)Y
-2686(c)Y
-3567 2878(c)N
-2846(c)Y
-2766(c)Y
-2686(c)Y
-3869 2878(c)N
-2846(c)Y
-2766(c)Y
-2686(c)Y
-4264 2878(c)N
-2862(c)Y
-2782(c)Y
-2702(c)Y
-2622(c)Y
-2542(c)Y
-2462(c)Y
-2382(c)Y
-2302(c)Y
-2222(c)Y
-2142(c)Y
-2062(c)Y
-1982(c)Y
-1902(c)Y
-1822(c)Y
-1742(c)Y
-1662(c)Y
-1582(c)Y
-1502(c)Y
-1422(c)Y
-1342(c)Y
-1262(c)Y
-1182(c)Y
-1102(c)Y
-1022(c)Y
-2891 3058(i)N
-2916(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-2 f
-3304 3150(hash)N
-3571(hsearch)X
-3939(%change)X
-1 f
-10 f
-2891 3154(i)N
-2916(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-2931 3246(CREATE/READ)N
-10 f
-2891 3250(i)N
-2916(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-3050 3342(user)N
-3329(0.3)X
-3648(0.4)X
-4048(25)X
-3082 3430(sys)N
-3329(0.0)X
-3648(0.0)X
-4088(0)X
-3 f
-2931 3518(elapsed)N
-3329(0.0)X
-3648(0.0)X
-4088(0)X
-1 f
-10 f
-2891 3522(i)N
-2916(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-2882 3534(c)N
-3462(c)Y
-3382(c)Y
-3302(c)Y
-3222(c)Y
-3142(c)Y
-3235 3518(c)N
-3494(c)Y
-3414(c)Y
-3334(c)Y
-3506 3518(c)N
-3494(c)Y
-3414(c)Y
-3334(c)Y
-3872 3518(c)N
-3494(c)Y
-3414(c)Y
-3334(c)Y
-4267 3534(c)N
-3462(c)Y
-3382(c)Y
-3302(c)Y
-3222(c)Y
-3142(c)Y
-3 f
-2706 3658(Figure)N
-2953(8b:)X
-1 f
-3084(Timing)X
-3339(results)X
-3568(for)X
-3682(the)X
-3800(password)X
-4123(database.)X
-10 f
-2706 3746 -0.0930(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)AN
-3 f
-3396 3988(References)N
-1 f
-2706 4120([ATT79])N
-3058(AT&T,)X
-3358(DBM\(3X\),)X
-2 f
-3773(Unix)X
-3990(Programmer's)X
-2878 4208(Manual,)N
-3194(Seventh)X
-3491(Edition,)X
-3793(Volume)X
-4085(1)X
-1 f
-(,)S
-4192(January,)X
-2878 4296(1979.)N
-2706 4472([ATT85])N
-3027(AT&T,)X
-3296(HSEARCH\(BA_LIB\),)X
-2 f
-4053(Unix)X
-4239(System)X
-2878 4560(User's)N
-3112(Manual,)X
-3401(System)X
-3644(V.3)X
-1 f
-3753(,)X
-3793(pp.)X
-3913(506-508,)X
-4220(1985.)X
-2706 4736([BRE73])N
-3025(Brent,)X
-3253(Richard)X
-3537(P.,)X
-3651(``Reducing)X
-4041(the)X
-4168(Retrieval)X
-2878 4824(Time)N
-3071(of)X
-3162(Scatter)X
-3409(Storage)X
-3678(Techniques'',)X
-2 f
-4146(Commun-)X
-2878 4912(ications)N
-3175(of)X
-3281(the)X
-3422(ACM)X
-1 f
-3591(,)X
-3654(Volume)X
-3955(16,)X
-4098(No.)X
-4259(2,)X
-4362(pp.)X
-2878 5000(105-109,)N
-3185(February,)X
-3515(1973.)X
-2706 5176([BSD86])N
-3055(NDBM\(3\),)X
-2 f
-3469(4.3BSD)X
-3775(Unix)X
-3990(Programmer's)X
-2878 5264(Manual)N
-3155(Reference)X
-3505(Guide)X
-1 f
-3701(,)X
-3749(University)X
-4114(of)X
-4208(Califor-)X
-2878 5352(nia,)N
-3016(Berkeley,)X
-3346(1986.)X
-2706 5528([ENB88])N
-3025(Enbody,)X
-3319(R.)X
-3417(J.,)X
-3533(Du,)X
-3676(H.)X
-3779(C.,)X
-3897(``Dynamic)X
-4270(Hash-)X
-2878 5616(ing)N
-3034(Schemes'',)X
-2 f
-3427(ACM)X
-3630(Computing)X
-4019(Surveys)X
-1 f
-4269(,)X
-4322(Vol.)X
-2878 5704(20,)N
-2998(No.)X
-3136(2,)X
-3216(pp.)X
-3336(85-113,)X
-3603(June)X
-3770(1988.)X
-3 f
-720 5960(USENIX)N
-9 f
-1042(-)X
-3 f
-1106(Winter)X
-1371('91)X
-9 f
-1498(-)X
-3 f
-1562(Dallas,)X
-1815(TX)X
-4384(11)X
-
-12 p
-%%Page: 12 12
-0(Courier)xf 0 f
-10 s 10 xH 0 xS 0 f
-3 f
-432 258(A)N
-510(New)X
-682(Hashing)X
-985(Package)X
-1290(for)X
-1413(UNIX)X
-3663(Seltzer)X
-3920(&)X
-4007(Yigit)X
-1 f
-432 538([FAG79])N
-776(Ronald)X
-1057(Fagin,)X
-1308(Jurg)X
-1495(Nievergelt,)X
-1903(Nicholas)X
-604 626(Pippenger,)N
-1003(H.)X
-1135(Raymond)X
-1500(Strong,)X
-1787(``Extendible)X
-604 714(Hashing)N
-901(--)X
-985(A)X
-1073(Fast)X
-1236(Access)X
-1493(Method)X
-1771(for)X
-1894(Dynamic)X
-604 802(Files'',)N
-2 f
-855(ACM)X
-1046(Transactions)X
-1485(on)X
-1586(Database)X
-1914(Systems)X
-1 f
-2168(,)X
-604 890(Volume)N
-882(4,)X
-962(No.)X
-1100(3.,)X
-1200(September)X
-1563(1979,)X
-1763(pp)X
-1863(315-34)X
-432 1066([KNU68],)N
-802(Knuth,)X
-1064(D.E.,)X
-2 f
-1273(The)X
-1434(Art)X
-1577(of)X
-1680(Computer)X
-2041(Pro-)X
-604 1154(gramming)N
-971(Vol.)X
-1140(3:)X
-1245(Sorting)X
-1518(and)X
-1676(Searching)X
-1 f
-2001(,)X
-2058(sec-)X
-604 1242(tions)N
-779(6.3-6.4,)X
-1046(pp)X
-1146(481-550.)X
-432 1418([LAR78])N
-747(Larson,)X
-1011(Per-Ake,)X
-1319(``Dynamic)X
-1687(Hashing'',)X
-2 f
-2048(BIT)X
-1 f
-(,)S
-604 1506(Vol.)N
-764(18,)X
-884(1978,)X
-1084(pp.)X
-1204(184-201.)X
-432 1682([LAR88])N
-752(Larson,)X
-1021(Per-Ake,)X
-1335(``Dynamic)X
-1709(Hash)X
-1900(Tables'',)X
-2 f
-604 1770(Communications)N
-1183(of)X
-1281(the)X
-1415(ACM)X
-1 f
-1584(,)X
-1640(Volume)X
-1934(31,)X
-2070(No.)X
-604 1858(4.,)N
-704(April)X
-893(1988,)X
-1093(pp)X
-1193(446-457.)X
-432 2034([LIT80])N
-731(Witold,)X
-1013(Litwin,)X
-1286(``Linear)X
-1590(Hashing:)X
-1939(A)X
-2036(New)X
-604 2122(Tool)N
-786(for)X
-911(File)X
-1065(and)X
-1211(Table)X
-1424(Addressing'',)X
-2 f
-1893(Proceed-)X
-604 2210(ings)N
-761(of)X
-847(the)X
-969(6th)X
-1095(International)X
-1540(Conference)X
-1933(on)X
-2036(Very)X
-604 2298(Large)N
-815(Databases)X
-1 f
-1153(,)X
-1193(1980.)X
-432 2474([NEL90])N
-743(Nelson,)X
-1011(Philip)X
-1222(A.,)X
-2 f
-1341(Gdbm)X
-1558(1.4)X
-1679(source)X
-1913(distribu-)X
-604 2562(tion)N
-748(and)X
-888(README)X
-1 f
-1209(,)X
-1249(August)X
-1500(1990.)X
-432 2738([THOM90])N
-840(Ken)X
-1011(Thompson,)X
-1410(private)X
-1670(communication,)X
-604 2826(Nov.)N
-782(1990.)X
-432 3002([TOR87])N
-790(Torek,)X
-1066(C.,)X
-1222(``Re:)X
-1470(dbm.a)X
-1751(and)X
-1950(ndbm.a)X
-604 3090(archives'',)N
-2 f
-966(USENET)X
-1279(newsgroup)X
-1650(comp.unix)X
-1 f
-2002(1987.)X
-432 3266([TOR88])N
-760(Torek,)X
-1006(C.,)X
-1133(``Re:)X
-1351(questions)X
-1686(regarding)X
-2027(data-)X
-604 3354(bases)N
-826(created)X
-1106(with)X
-1295(dbm)X
-1484(and)X
-1647(ndbm)X
-1876(routines'')X
-2 f
-604 3442(USENET)N
-937(newsgroup)X
-1328(comp.unix.questions)X
-1 f
-1982(,)X
-2041(June)X
-604 3530(1988.)N
-432 3706([WAL84])N
-773(Wales,)X
-1018(R.,)X
-1135(``Discussion)X
-1564(of)X
-1655("dbm")X
-1887(data)X
-2045(base)X
-604 3794(system'',)N
-2 f
-973(USENET)X
-1339(newsgroup)X
-1762(unix.wizards)X
-1 f
-2168(,)X
-604 3882(January,)N
-894(1984.)X
-432 4058([YIG89])N
-751(Ozan)X
-963(S.)X
-1069(Yigit,)X
-1294(``How)X
-1545(to)X
-1648(Roll)X
-1826(Your)X
-2032(Own)X
-604 4146(Dbm/Ndbm'',)N
-2 f
-1087(unpublished)X
-1504(manuscript)X
-1 f
-(,)S
-1910(Toronto,)X
-604 4234(July,)N
-777(1989)X
-3 f
-432 5960(12)N
-2970(USENIX)X
-9 f
-3292(-)X
-3 f
-3356(Winter)X
-3621('91)X
-9 f
-3748(-)X
-3 f
-3812(Dallas,)X
-4065(TX)X
-
-13 p
-%%Page: 13 13
-0(Courier)xf 0 f
-10 s 10 xH 0 xS 0 f
-3 f
-720 258(Seltzer)N
-977(&)X
-1064(Yigit)X
-3278(A)X
-3356(New)X
-3528(Hashing)X
-3831(Package)X
-4136(for)X
-4259(UNIX)X
-1 f
-720 538(Margo)N
-960(I.)X
-1033(Seltzer)X
-1282(is)X
-1361(a)X
-1423(Ph.D.)X
-1631(student)X
-1887(in)X
-1974(the)X
-2097(Department)X
-720 626(of)N
-823(Electrical)X
-1167(Engineering)X
-1595(and)X
-1747(Computer)X
-2102(Sciences)X
-2418(at)X
-720 714(the)N
-850(University)X
-1220(of)X
-1318(California,)X
-1694(Berkeley.)X
-2055(Her)X
-2207(research)X
-720 802(interests)N
-1017(include)X
-1283(\256le)X
-1415(systems,)X
-1718(databases,)X
-2076(and)X
-2221(transac-)X
-720 890(tion)N
-896(processing)X
-1291(systems.)X
-1636(She)X
-1807(spent)X
-2027(several)X
-2306(years)X
-720 978(working)N
-1026(at)X
-1123(startup)X
-1380(companies)X
-1762(designing)X
-2112(and)X
-2267(imple-)X
-720 1066(menting)N
-1048(\256le)X
-1216(systems)X
-1535(and)X
-1716(transaction)X
-2133(processing)X
-720 1154(software)N
-1026(and)X
-1170(designing)X
-1509(microprocessors.)X
-2103(Ms.)X
-2253(Seltzer)X
-720 1242(received)N
-1057(her)X
-1223(AB)X
-1397(in)X
-1522(Applied)X
-1843(Mathematics)X
-2320(from)X
-720 1330 0.1953(Harvard/Radcliffe)AN
-1325(College)X
-1594(in)X
-1676(1983.)X
-720 1444(In)N
-810(her)X
-936(spare)X
-1129(time,)X
-1313(Margo)X
-1549(can)X
-1683(usually)X
-1936(be)X
-2034(found)X
-2243(prepar-)X
-720 1532(ing)N
-868(massive)X
-1171(quantities)X
-1527(of)X
-1639(food)X
-1831(for)X
-1970(hungry)X
-2242(hoards,)X
-720 1620(studying)N
-1022(Japanese,)X
-1355(or)X
-1449(playing)X
-1716(soccer)X
-1948(with)X
-2116(an)X
-2218(exciting)X
-720 1708(Bay)N
-912(Area)X
-1132(Women's)X
-1507(Soccer)X
-1788(team,)X
-2026(the)X
-2186(Berkeley)X
-720 1796(Bruisers.)N
-720 1910(Ozan)N
-915(\()X
-3 f
-942(Oz)X
-1 f
-1040(\))X
-1092(Yigit)X
-1281(is)X
-1358(currently)X
-1672(a)X
-1732(software)X
-2033(engineer)X
-2334(with)X
-720 1998(the)N
-886(Communications)X
-1499(Research)X
-1861(and)X
-2044(Development)X
-720 2086(group,)N
-948(Computing)X
-1328(Services,)X
-1641(York)X
-1826(University.)X
-2224(His)X
-2355(for-)X
-720 2174(mative)N
-967(years)X
-1166(were)X
-1352(also)X
-1510(spent)X
-1708(at)X
-1795(York,)X
-2009(where)X
-2234(he)X
-2338(held)X
-720 2262(system)N
-985(programmer)X
-1425(and)X
-1583(administrator)X
-2052(positions)X
-2382(for)X
-720 2350(various)N
-995(mixtures)X
-1314(of)X
-1420(of)X
-1526(UNIX)X
-1765(systems)X
-2056(starting)X
-2334(with)X
-720 2438(Berkeley)N
-1031(4.1)X
-1151(in)X
-1233(1982,)X
-1433(while)X
-1631(at)X
-1709(the)X
-1827(same)X
-2012(time)X
-2174(obtaining)X
-720 2526(a)N
-776(degree)X
-1011(in)X
-1093(Computer)X
-1433(Science.)X
-720 2640(In)N
-813(his)X
-931(copious)X
-1205(free)X
-1356(time,)X
-1543(Oz)X
-1662(enjoys)X
-1896(working)X
-2188(on)X
-2293(what-)X
-720 2728(ever)N
-890(software)X
-1197(looks)X
-1400(interesting,)X
-1788(which)X
-2014(often)X
-2209(includes)X
-720 2816(language)N
-1044(interpreters,)X
-1464(preprocessors,)X
-1960(and)X
-2110(lately,)X
-2342(pro-)X
-720 2904(gram)N
-905(generators)X
-1260(and)X
-1396(expert)X
-1617(systems.)X
-720 3018(Oz)N
-836(has)X
-964(authored)X
-1266(several)X
-1515(public-domain)X
-2003(software)X
-2301(tools,)X
-720 3106(including)N
-1069(an)X
-1191(nroff-like)X
-1545(text)X
-1711(formatter)X
-2 f
-2056(proff)X
-1 f
-2257(that)X
-2423(is)X
-720 3194(apparently)N
-1083(still)X
-1226(used)X
-1397(in)X
-1483(some)X
-1676(basement)X
-2002(PCs.)X
-2173(His)X
-2307(latest)X
-720 3282(obsessions)N
-1143(include)X
-1460(the)X
-1639(incredible)X
-2040(programming)X
-720 3370(language)N
-1030(Scheme,)X
-1324(and)X
-1460(Chinese)X
-1738(Brush)X
-1949(painting.)X
-3 f
-720 5960(USENIX)N
-9 f
-1042(-)X
-3 f
-1106(Winter)X
-1371('91)X
-9 f
-1498(-)X
-3 f
-1562(Dallas,)X
-1815(TX)X
-4384(13)X
-
-14 p
-%%Page: 14 14
-0(Courier)xf 0 f
-10 s 10 xH 0 xS 0 f
-3 f
-432 5960(14)N
-2970(USENIX)X
-9 f
-3292(-)X
-3 f
-3356(Winter)X
-3621('91)X
-9 f
-3748(-)X
-3 f
-3812(Dallas,)X
-4065(TX)X
-
-14 p
-%%Trailer
-xt
-
-xs
diff --git a/src/util/db2/docs/libtp.usenix.ps b/src/util/db2/docs/libtp.usenix.ps
deleted file mode 100644
index 5b5ba6e1b8..0000000000
--- a/src/util/db2/docs/libtp.usenix.ps
+++ /dev/null
@@ -1,12340 +0,0 @@
-%!PS-Adobe-1.0
-%%Creator: utopia:margo (& Seltzer,608-13E,8072,)
-%%Title: stdin (ditroff)
-%%CreationDate: Thu Dec 12 15:32:11 1991
-%%EndComments
-% @(#)psdit.pro 1.3 4/15/88
-% lib/psdit.pro -- prolog for psdit (ditroff) files
-% Copyright (c) 1984, 1985 Adobe Systems Incorporated. All Rights Reserved.
-% last edit: shore Sat Nov 23 20:28:03 1985
-% RCSID: $Header$
-
-% Changed by Edward Wang (edward@ucbarpa.berkeley.edu) to handle graphics,
-% 17 Feb, 87.
-
-/$DITroff 140 dict def $DITroff begin
-/fontnum 1 def /fontsize 10 def /fontheight 10 def /fontslant 0 def
-/xi{0 72 11 mul translate 72 resolution div dup neg scale 0 0 moveto
- /fontnum 1 def /fontsize 10 def /fontheight 10 def /fontslant 0 def F
- /pagesave save def}def
-/PB{save /psv exch def currentpoint translate
- resolution 72 div dup neg scale 0 0 moveto}def
-/PE{psv restore}def
-/arctoobig 90 def /arctoosmall .05 def
-/m1 matrix def /m2 matrix def /m3 matrix def /oldmat matrix def
-/tan{dup sin exch cos div}def
-/point{resolution 72 div mul}def
-/dround {transform round exch round exch itransform}def
-/xT{/devname exch def}def
-/xr{/mh exch def /my exch def /resolution exch def}def
-/xp{}def
-/xs{docsave restore end}def
-/xt{}def
-/xf{/fontname exch def /slotno exch def fontnames slotno get fontname eq not
- {fonts slotno fontname findfont put fontnames slotno fontname put}if}def
-/xH{/fontheight exch def F}def
-/xS{/fontslant exch def F}def
-/s{/fontsize exch def /fontheight fontsize def F}def
-/f{/fontnum exch def F}def
-/F{fontheight 0 le{/fontheight fontsize def}if
- fonts fontnum get fontsize point 0 0 fontheight point neg 0 0 m1 astore
- fontslant 0 ne{1 0 fontslant tan 1 0 0 m2 astore m3 concatmatrix}if
- makefont setfont .04 fontsize point mul 0 dround pop setlinewidth}def
-/X{exch currentpoint exch pop moveto show}def
-/N{3 1 roll moveto show}def
-/Y{exch currentpoint pop exch moveto show}def
-/S{show}def
-/ditpush{}def/ditpop{}def
-/AX{3 -1 roll currentpoint exch pop moveto 0 exch ashow}def
-/AN{4 2 roll moveto 0 exch ashow}def
-/AY{3 -1 roll currentpoint pop exch moveto 0 exch ashow}def
-/AS{0 exch ashow}def
-/MX{currentpoint exch pop moveto}def
-/MY{currentpoint pop exch moveto}def
-/MXY{moveto}def
-/cb{pop}def % action on unknown char -- nothing for now
-/n{}def/w{}def
-/p{pop showpage pagesave restore /pagesave save def}def
-/Dt{/Dlinewidth exch def}def 1 Dt
-/Ds{/Ddash exch def}def -1 Ds
-/Di{/Dstipple exch def}def 1 Di
-/Dsetlinewidth{2 Dlinewidth mul setlinewidth}def
-/Dsetdash{Ddash 4 eq{[8 12]}{Ddash 16 eq{[32 36]}
- {Ddash 20 eq{[32 12 8 12]}{[]}ifelse}ifelse}ifelse 0 setdash}def
-/Dstroke{gsave Dsetlinewidth Dsetdash 1 setlinecap stroke grestore
- currentpoint newpath moveto}def
-/Dl{rlineto Dstroke}def
-/arcellipse{/diamv exch def /diamh exch def oldmat currentmatrix pop
- currentpoint translate 1 diamv diamh div scale /rad diamh 2 div def
- currentpoint exch rad add exch rad -180 180 arc oldmat setmatrix}def
-/Dc{dup arcellipse Dstroke}def
-/De{arcellipse Dstroke}def
-/Da{/endv exch def /endh exch def /centerv exch def /centerh exch def
- /cradius centerv centerv mul centerh centerh mul add sqrt def
- /eradius endv endv mul endh endh mul add sqrt def
- /endang endv endh atan def
- /startang centerv neg centerh neg atan def
- /sweep startang endang sub dup 0 lt{360 add}if def
- sweep arctoobig gt
- {/midang startang sweep 2 div sub def /midrad cradius eradius add 2 div def
- /midh midang cos midrad mul def /midv midang sin midrad mul def
- midh neg midv neg endh endv centerh centerv midh midv Da
- Da}
- {sweep arctoosmall ge
- {/controldelt 1 sweep 2 div cos sub 3 sweep 2 div sin mul div 4 mul def
- centerv neg controldelt mul centerh controldelt mul
- endv neg controldelt mul centerh add endh add
- endh controldelt mul centerv add endv add
- centerh endh add centerv endv add rcurveto Dstroke}
- {centerh endh add centerv endv add rlineto Dstroke}
- ifelse}
- ifelse}def
-/Dpatterns[
-[%cf[widthbits]
-[8<0000000000000010>]
-[8<0411040040114000>]
-[8<0204081020408001>]
-[8<0000103810000000>]
-[8<6699996666999966>]
-[8<0000800100001008>]
-[8<81c36666c3810000>]
-[8<0f0e0c0800000000>]
-[8<0000000000000010>]
-[8<0411040040114000>]
-[8<0204081020408001>]
-[8<0000001038100000>]
-[8<6699996666999966>]
-[8<0000800100001008>]
-[8<81c36666c3810000>]
-[8<0f0e0c0800000000>]
-[8<0042660000246600>]
-[8<0000990000990000>]
-[8<0804020180402010>]
-[8<2418814242811824>]
-[8<6699996666999966>]
-[8<8000000008000000>]
-[8<00001c3e363e1c00>]
-[8<0000000000000000>]
-[32<00000040000000c00000004000000040000000e0000000000000000000000000>]
-[32<00000000000060000000900000002000000040000000f0000000000000000000>]
-[32<000000000000000000e0000000100000006000000010000000e0000000000000>]
-[32<00000000000000002000000060000000a0000000f00000002000000000000000>]
-[32<0000000e0000000000000000000000000000000f000000080000000e00000001>]
-[32<0000090000000600000000000000000000000000000007000000080000000e00>]
-[32<00010000000200000004000000040000000000000000000000000000000f0000>]
-[32<0900000006000000090000000600000000000000000000000000000006000000>]]
-[%ug
-[8<0000020000000000>]
-[8<0000020000002000>]
-[8<0004020000002000>]
-[8<0004020000402000>]
-[8<0004060000402000>]
-[8<0004060000406000>]
-[8<0006060000406000>]
-[8<0006060000606000>]
-[8<00060e0000606000>]
-[8<00060e000060e000>]
-[8<00070e000060e000>]
-[8<00070e000070e000>]
-[8<00070e020070e000>]
-[8<00070e020070e020>]
-[8<04070e020070e020>]
-[8<04070e024070e020>]
-[8<04070e064070e020>]
-[8<04070e064070e060>]
-[8<06070e064070e060>]
-[8<06070e066070e060>]
-[8<06070f066070e060>]
-[8<06070f066070f060>]
-[8<060f0f066070f060>]
-[8<060f0f0660f0f060>]
-[8<060f0f0760f0f060>]
-[8<060f0f0760f0f070>]
-[8<0e0f0f0760f0f070>]
-[8<0e0f0f07e0f0f070>]
-[8<0e0f0f0fe0f0f070>]
-[8<0e0f0f0fe0f0f0f0>]
-[8<0f0f0f0fe0f0f0f0>]
-[8<0f0f0f0ff0f0f0f0>]
-[8<1f0f0f0ff0f0f0f0>]
-[8<1f0f0f0ff1f0f0f0>]
-[8<1f0f0f8ff1f0f0f0>]
-[8<1f0f0f8ff1f0f0f8>]
-[8<9f0f0f8ff1f0f0f8>]
-[8<9f0f0f8ff9f0f0f8>]
-[8<9f0f0f9ff9f0f0f8>]
-[8<9f0f0f9ff9f0f0f9>]
-[8<9f8f0f9ff9f0f0f9>]
-[8<9f8f0f9ff9f8f0f9>]
-[8<9f8f1f9ff9f8f0f9>]
-[8<9f8f1f9ff9f8f1f9>]
-[8<bf8f1f9ff9f8f1f9>]
-[8<bf8f1f9ffbf8f1f9>]
-[8<bf8f1fdffbf8f1f9>]
-[8<bf8f1fdffbf8f1fd>]
-[8<ff8f1fdffbf8f1fd>]
-[8<ff8f1fdffff8f1fd>]
-[8<ff8f1ffffff8f1fd>]
-[8<ff8f1ffffff8f1ff>]
-[8<ff9f1ffffff8f1ff>]
-[8<ff9f1ffffff9f1ff>]
-[8<ff9f9ffffff9f1ff>]
-[8<ff9f9ffffff9f9ff>]
-[8<ffbf9ffffff9f9ff>]
-[8<ffbf9ffffffbf9ff>]
-[8<ffbfdffffffbf9ff>]
-[8<ffbfdffffffbfdff>]
-[8<ffffdffffffbfdff>]
-[8<ffffdffffffffdff>]
-[8<fffffffffffffdff>]
-[8<ffffffffffffffff>]]
-[%mg
-[8<8000000000000000>]
-[8<0822080080228000>]
-[8<0204081020408001>]
-[8<40e0400000000000>]
-[8<66999966>]
-[8<8001000010080000>]
-[8<81c36666c3810000>]
-[8<f0e0c08000000000>]
-[16<07c00f801f003e007c00f800f001e003c007800f001f003e007c00f801f003e0>]
-[16<1f000f8007c003e001f000f8007c003e001f800fc007e003f001f8007c003e00>]
-[8<c3c300000000c3c3>]
-[16<0040008001000200040008001000200040008000000100020004000800100020>]
-[16<0040002000100008000400020001800040002000100008000400020001000080>]
-[16<1fc03fe07df0f8f8f07de03fc01f800fc01fe03ff07df8f87df03fe01fc00f80>]
-[8<80>]
-[8<8040201000000000>]
-[8<84cc000048cc0000>]
-[8<9900009900000000>]
-[8<08040201804020100800020180002010>]
-[8<2418814242811824>]
-[8<66999966>]
-[8<8000000008000000>]
-[8<70f8d8f870000000>]
-[8<0814224180402010>]
-[8<aa00440a11a04400>]
-[8<018245aa45820100>]
-[8<221c224180808041>]
-[8<88000000>]
-[8<0855800080550800>]
-[8<2844004482440044>]
-[8<0810204080412214>]
-[8<00>]]]def
-/Dfill{
- transform /maxy exch def /maxx exch def
- transform /miny exch def /minx exch def
- minx maxx gt{/minx maxx /maxx minx def def}if
- miny maxy gt{/miny maxy /maxy miny def def}if
- Dpatterns Dstipple 1 sub get exch 1 sub get
- aload pop /stip exch def /stipw exch def /stiph 128 def
- /imatrix[stipw 0 0 stiph 0 0]def
- /tmatrix[stipw 0 0 stiph 0 0]def
- /minx minx cvi stiph idiv stiph mul def
- /miny miny cvi stipw idiv stipw mul def
- gsave eoclip 0 setgray
- miny stiph maxy{
- tmatrix exch 5 exch put
- minx stipw maxx{
- tmatrix exch 4 exch put tmatrix setmatrix
- stipw stiph true imatrix {stip} imagemask
- }for
- }for
- grestore
-}def
-/Dp{Dfill Dstroke}def
-/DP{Dfill currentpoint newpath moveto}def
-end
-
-/ditstart{$DITroff begin
- /nfonts 60 def % NFONTS makedev/ditroff dependent!
- /fonts[nfonts{0}repeat]def
- /fontnames[nfonts{()}repeat]def
-/docsave save def
-}def
-
-% character outcalls
-/oc{
- /pswid exch def /cc exch def /name exch def
- /ditwid pswid fontsize mul resolution mul 72000 div def
- /ditsiz fontsize resolution mul 72 div def
- ocprocs name known{ocprocs name get exec}{name cb}ifelse
-}def
-/fractm [.65 0 0 .6 0 0] def
-/fraction{
- /fden exch def /fnum exch def gsave /cf currentfont def
- cf fractm makefont setfont 0 .3 dm 2 copy neg rmoveto
- fnum show rmoveto currentfont cf setfont(\244)show setfont fden show
- grestore ditwid 0 rmoveto
-}def
-/oce{grestore ditwid 0 rmoveto}def
-/dm{ditsiz mul}def
-/ocprocs 50 dict def ocprocs begin
-(14){(1)(4)fraction}def
-(12){(1)(2)fraction}def
-(34){(3)(4)fraction}def
-(13){(1)(3)fraction}def
-(23){(2)(3)fraction}def
-(18){(1)(8)fraction}def
-(38){(3)(8)fraction}def
-(58){(5)(8)fraction}def
-(78){(7)(8)fraction}def
-(sr){gsave 0 .06 dm rmoveto(\326)show oce}def
-(is){gsave 0 .15 dm rmoveto(\362)show oce}def
-(->){gsave 0 .02 dm rmoveto(\256)show oce}def
-(<-){gsave 0 .02 dm rmoveto(\254)show oce}def
-(==){gsave 0 .05 dm rmoveto(\272)show oce}def
-(uc){gsave currentpoint 400 .009 dm mul add translate
- 8 -8 scale ucseal oce}def
-end
-
-% an attempt at a PostScript FONT to implement ditroff special chars
-% this will enable us to
-% cache the little buggers
-% generate faster, more compact PS out of psdit
-% confuse everyone (including myself)!
-50 dict dup begin
-/FontType 3 def
-/FontName /DIThacks def
-/FontMatrix [.001 0 0 .001 0 0] def
-/FontBBox [-260 -260 900 900] def% a lie but ...
-/Encoding 256 array def
-0 1 255{Encoding exch /.notdef put}for
-Encoding
- dup 8#040/space put %space
- dup 8#110/rc put %right ceil
- dup 8#111/lt put %left top curl
- dup 8#112/bv put %bold vert
- dup 8#113/lk put %left mid curl
- dup 8#114/lb put %left bot curl
- dup 8#115/rt put %right top curl
- dup 8#116/rk put %right mid curl
- dup 8#117/rb put %right bot curl
- dup 8#120/rf put %right floor
- dup 8#121/lf put %left floor
- dup 8#122/lc put %left ceil
- dup 8#140/sq put %square
- dup 8#141/bx put %box
- dup 8#142/ci put %circle
- dup 8#143/br put %box rule
- dup 8#144/rn put %root extender
- dup 8#145/vr put %vertical rule
- dup 8#146/ob put %outline bullet
- dup 8#147/bu put %bullet
- dup 8#150/ru put %rule
- dup 8#151/ul put %underline
- pop
-/DITfd 100 dict def
-/BuildChar{0 begin
- /cc exch def /fd exch def
- /charname fd /Encoding get cc get def
- /charwid fd /Metrics get charname get def
- /charproc fd /CharProcs get charname get def
- charwid 0 fd /FontBBox get aload pop setcachedevice
- 2 setlinejoin 40 setlinewidth
- newpath 0 0 moveto gsave charproc grestore
- end}def
-/BuildChar load 0 DITfd put
-/CharProcs 50 dict def
-CharProcs begin
-/space{}def
-/.notdef{}def
-/ru{500 0 rls}def
-/rn{0 840 moveto 500 0 rls}def
-/vr{0 800 moveto 0 -770 rls}def
-/bv{0 800 moveto 0 -1000 rls}def
-/br{0 840 moveto 0 -1000 rls}def
-/ul{0 -140 moveto 500 0 rls}def
-/ob{200 250 rmoveto currentpoint newpath 200 0 360 arc closepath stroke}def
-/bu{200 250 rmoveto currentpoint newpath 200 0 360 arc closepath fill}def
-/sq{80 0 rmoveto currentpoint dround newpath moveto
- 640 0 rlineto 0 640 rlineto -640 0 rlineto closepath stroke}def
-/bx{80 0 rmoveto currentpoint dround newpath moveto
- 640 0 rlineto 0 640 rlineto -640 0 rlineto closepath fill}def
-/ci{500 360 rmoveto currentpoint newpath 333 0 360 arc
- 50 setlinewidth stroke}def
-
-/lt{0 -200 moveto 0 550 rlineto currx 800 2cx s4 add exch s4 a4p stroke}def
-/lb{0 800 moveto 0 -550 rlineto currx -200 2cx s4 add exch s4 a4p stroke}def
-/rt{0 -200 moveto 0 550 rlineto currx 800 2cx s4 sub exch s4 a4p stroke}def
-/rb{0 800 moveto 0 -500 rlineto currx -200 2cx s4 sub exch s4 a4p stroke}def
-/lk{0 800 moveto 0 300 -300 300 s4 arcto pop pop 1000 sub
- 0 300 4 2 roll s4 a4p 0 -200 lineto stroke}def
-/rk{0 800 moveto 0 300 s2 300 s4 arcto pop pop 1000 sub
- 0 300 4 2 roll s4 a4p 0 -200 lineto stroke}def
-/lf{0 800 moveto 0 -1000 rlineto s4 0 rls}def
-/rf{0 800 moveto 0 -1000 rlineto s4 neg 0 rls}def
-/lc{0 -200 moveto 0 1000 rlineto s4 0 rls}def
-/rc{0 -200 moveto 0 1000 rlineto s4 neg 0 rls}def
-end
-
-/Metrics 50 dict def Metrics begin
-/.notdef 0 def
-/space 500 def
-/ru 500 def
-/br 0 def
-/lt 416 def
-/lb 416 def
-/rt 416 def
-/rb 416 def
-/lk 416 def
-/rk 416 def
-/rc 416 def
-/lc 416 def
-/rf 416 def
-/lf 416 def
-/bv 416 def
-/ob 350 def
-/bu 350 def
-/ci 750 def
-/bx 750 def
-/sq 750 def
-/rn 500 def
-/ul 500 def
-/vr 0 def
-end
-
-DITfd begin
-/s2 500 def /s4 250 def /s3 333 def
-/a4p{arcto pop pop pop pop}def
-/2cx{2 copy exch}def
-/rls{rlineto stroke}def
-/currx{currentpoint pop}def
-/dround{transform round exch round exch itransform} def
-end
-end
-/DIThacks exch definefont pop
-ditstart
-(psc)xT
-576 1 1 xr
-1(Times-Roman)xf 1 f
-2(Times-Italic)xf 2 f
-3(Times-Bold)xf 3 f
-4(Times-BoldItalic)xf 4 f
-5(Helvetica)xf 5 f
-6(Helvetica-Bold)xf 6 f
-7(Courier)xf 7 f
-8(Courier-Bold)xf 8 f
-9(Symbol)xf 9 f
-10(DIThacks)xf 10 f
-10 s
-1 f
-xi
-%%EndProlog
-
-%%Page: 1 1
-10 s 10 xH 0 xS 1 f
-3 f
-14 s
-1205 1206(LIBTP:)N
-1633(Portable,)X
-2100(M)X
-2206(odular)X
-2551(Transactions)X
-3202(for)X
-3374(UNIX)X
-1 f
-11 s
-3661 1162(1)N
-2 f
-12 s
-2182 1398(Margo)N
-2467(Seltzer)X
-2171 1494(Michael)N
-2511(Olson)X
-1800 1590(University)N
-2225(of)X
-2324(California,)X
-2773(Berkeley)X
-3 f
-2277 1878(Abstract)N
-1 f
-10 s
-755 2001(Transactions)N
-1198(provide)X
-1475(a)X
-1543(useful)X
-1771(programming)X
-2239(paradigm)X
-2574(for)X
-2700(maintaining)X
-3114(logical)X
-3364(consistency,)X
-3790(arbitrating)X
-4156(con-)X
-555 2091(current)N
-808(access,)X
-1059(and)X
-1200(managing)X
-1540(recovery.)X
-1886(In)X
-1977(traditional)X
-2330(UNIX)X
-2555(systems,)X
-2852(the)X
-2974(only)X
-3140(easy)X
-3307(way)X
-3465(of)X
-3556(using)X
-3753(transactions)X
-4160(is)X
-4237(to)X
-555 2181(purchase)N
-876(a)X
-947(database)X
-1258(system.)X
-1554(Such)X
-1748(systems)X
-2035(are)X
-2168(often)X
-2367(slow,)X
-2572(costly,)X
-2817(and)X
-2967(may)X
-3139(not)X
-3275(provide)X
-3554(the)X
-3686(exact)X
-3890(functionality)X
-555 2271(desired.)N
-848(This)X
-1011(paper)X
-1210(presents)X
-1493(the)X
-1611(design,)X
-1860(implementation,)X
-2402(and)X
-2538(performance)X
-2965(of)X
-3052(LIBTP,)X
-3314(a)X
-3370(simple,)X
-3623(non-proprietary)X
-4147(tran-)X
-555 2361(saction)N
-809(library)X
-1050(using)X
-1249(the)X
-1373(4.4BSD)X
-1654(database)X
-1957(access)X
-2189(routines)X
-2473(\()X
-3 f
-2500(db)X
-1 f
-2588(\(3\)\).)X
-2775(On)X
-2899(a)X
-2961(conventional)X
-3401(transaction)X
-3779(processing)X
-4148(style)X
-555 2451(benchmark,)N
-959(its)X
-1061(performance)X
-1495(is)X
-1575(approximately)X
-2065(85%)X
-2239(that)X
-2386(of)X
-2480(the)X
-2604(database)X
-2907(access)X
-3139(routines)X
-3423(without)X
-3693(transaction)X
-4071(protec-)X
-555 2541(tion,)N
-725(200%)X
-938(that)X
-1084(of)X
-1177(using)X
-3 f
-1376(fsync)X
-1 f
-1554(\(2\))X
-1674(to)X
-1761(commit)X
-2030(modi\256cations)X
-2490(to)X
-2577(disk,)X
-2755(and)X
-2896(125%)X
-3108(that)X
-3253(of)X
-3345(a)X
-3406(commercial)X
-3810(relational)X
-4138(data-)X
-555 2631(base)N
-718(system.)X
-3 f
-555 2817(1.)N
-655(Introduction)X
-1 f
-755 2940(Transactions)N
-1186(are)X
-1306(used)X
-1474(in)X
-1557(database)X
-1855(systems)X
-2129(to)X
-2212(enable)X
-2443(concurrent)X
-2807(users)X
-2992(to)X
-3074(apply)X
-3272(multi-operation)X
-3790(updates)X
-4055(without)X
-555 3030(violating)N
-863(the)X
-985(integrity)X
-1280(of)X
-1371(the)X
-1493(database.)X
-1814(They)X
-2003(provide)X
-2271(the)X
-2392(properties)X
-2736(of)X
-2826(atomicity,)X
-3171(consistency,)X
-3588(isolation,)X
-3906(and)X
-4045(durabil-)X
-555 3120(ity.)N
-701(By)X
-816(atomicity,)X
-1160(we)X
-1276(mean)X
-1472(that)X
-1614(the)X
-1734(set)X
-1845(of)X
-1934(updates)X
-2200(comprising)X
-2581(a)X
-2638(transaction)X
-3011(must)X
-3187(be)X
-3284(applied)X
-3541(as)X
-3629(a)X
-3686(single)X
-3898(unit;)X
-4085(that)X
-4226(is,)X
-555 3210(they)N
-714(must)X
-890(either)X
-1094(all)X
-1195(be)X
-1292(applied)X
-1549(to)X
-1632(the)X
-1751(database)X
-2049(or)X
-2137(all)X
-2238(be)X
-2335(absent.)X
-2601(Consistency)X
-3013(requires)X
-3293(that)X
-3434(a)X
-3491(transaction)X
-3864(take)X
-4019(the)X
-4138(data-)X
-555 3300(base)N
-725(from)X
-908(one)X
-1051(logically)X
-1358(consistent)X
-1704(state)X
-1877(to)X
-1965(another.)X
-2272(The)X
-2423(property)X
-2721(of)X
-2814(isolation)X
-3115(requires)X
-3400(that)X
-3546(concurrent)X
-3916(transactions)X
-555 3390(yield)N
-750(results)X
-994(which)X
-1225(are)X
-1358(indistinguishable)X
-1938(from)X
-2128(the)X
-2260(results)X
-2503(which)X
-2733(would)X
-2967(be)X
-3077(obtained)X
-3387(by)X
-3501(running)X
-3784(the)X
-3916(transactions)X
-555 3480(sequentially.)N
-1002(Finally,)X
-1268(durability)X
-1599(requires)X
-1878(that)X
-2018(once)X
-2190(transactions)X
-2593(have)X
-2765(been)X
-2937(committed,)X
-3319(their)X
-3486(results)X
-3715(must)X
-3890(be)X
-3986(preserved)X
-555 3570(across)N
-776(system)X
-1018(failures)X
-1279([TPCB90].)X
-755 3693(Although)N
-1080(these)X
-1268(properties)X
-1612(are)X
-1734(most)X
-1912(frequently)X
-2265(discussed)X
-2595(in)X
-2680(the)X
-2801(context)X
-3060(of)X
-3150(databases,)X
-3501(they)X
-3661(are)X
-3782(useful)X
-4000(program-)X
-555 3783(ming)N
-750(paradigms)X
-1114(for)X
-1238(more)X
-1433(general)X
-1700(purpose)X
-1984(applications.)X
-2441(There)X
-2659(are)X
-2788(several)X
-3046(different)X
-3353(situations)X
-3689(where)X
-3916(transactions)X
-555 3873(can)N
-687(be)X
-783(used)X
-950(to)X
-1032(replace)X
-1285(current)X
-1533(ad-hoc)X
-1772(mechanisms.)X
-755 3996(One)N
-910(situation)X
-1206(is)X
-1280(when)X
-1475(multiple)X
-1762(\256les)X
-1916(or)X
-2004(parts)X
-2181(of)X
-2269(\256les)X
-2422(need)X
-2594(to)X
-2676(be)X
-2772(updated)X
-3046(in)X
-3128(an)X
-3224(atomic)X
-3462(fashion.)X
-3758(For)X
-3889(example,)X
-4201(the)X
-555 4086(traditional)N
-907(UNIX)X
-1131(\256le)X
-1256(system)X
-1501(uses)X
-1661(ordering)X
-1955(constraints)X
-2324(to)X
-2408(achieve)X
-2676(recoverability)X
-3144(in)X
-3228(the)X
-3348(face)X
-3505(of)X
-3594(crashes.)X
-3893(When)X
-4107(a)X
-4165(new)X
-555 4176(\256le)N
-678(is)X
-752(created,)X
-1026(its)X
-1122(inode)X
-1321(is)X
-1395(written)X
-1642(to)X
-1724(disk)X
-1877(before)X
-2103(the)X
-2221(new)X
-2375(\256le)X
-2497(is)X
-2570(added)X
-2782(to)X
-2864(the)X
-2982(directory)X
-3292(structure.)X
-3633(This)X
-3795(guarantees)X
-4159(that,)X
-555 4266(if)N
-627(the)X
-748(system)X
-993(crashes)X
-1253(between)X
-1544(the)X
-1665(two)X
-1808(I/O's,)X
-2016(the)X
-2137(directory)X
-2450(does)X
-2620(not)X
-2744(contain)X
-3002(a)X
-3060 0.4531(reference)AX
-3383(to)X
-3467(an)X
-3565(invalid)X
-3809(inode.)X
-4049(In)X
-4138(actu-)X
-555 4356(ality,)N
-741(the)X
-863(desired)X
-1119(effect)X
-1326(is)X
-1402(that)X
-1545(these)X
-1733(two)X
-1876(updates)X
-2144(have)X
-2319(the)X
-2440(transactional)X
-2873(property)X
-3168(of)X
-3258(atomicity)X
-3583(\(either)X
-3816(both)X
-3981(writes)X
-4200(are)X
-555 4446(visible)N
-790(or)X
-879(neither)X
-1124(is\).)X
-1266(Rather)X
-1501(than)X
-1660(building)X
-1947(special)X
-2191(purpose)X
-2466(recovery)X
-2769(mechanisms)X
-3186(into)X
-3331(the)X
-3450(\256le)X
-3573(system)X
-3816(or)X
-3904(related)X
-4144(tools)X
-555 4536(\()N
-2 f
-582(e.g.)X
-3 f
-726(fsck)X
-1 f
-864(\(8\)\),)X
-1033(one)X
-1177(could)X
-1383(use)X
-1518(general)X
-1783(purpose)X
-2064(transaction)X
-2443(recovery)X
-2752(protocols)X
-3077(after)X
-3252(system)X
-3501(failure.)X
-3778(Any)X
-3943(application)X
-555 4626(that)N
-705(needs)X
-918(to)X
-1010(keep)X
-1192(multiple,)X
-1508(related)X
-1757(\256les)X
-1920(\(or)X
-2044(directories\))X
-2440(consistent)X
-2790(should)X
-3032(do)X
-3141(so)X
-3241(using)X
-3443(transactions.)X
-3895(Source)X
-4147(code)X
-555 4716(control)N
-805(systems,)X
-1101(such)X
-1271(as)X
-1361(RCS)X
-1534(and)X
-1673(SCCS,)X
-1910(should)X
-2146(use)X
-2276(transaction)X
-2651(semantics)X
-2990(to)X
-3075(allow)X
-3276(the)X
-3397(``checking)X
-3764(in'')X
-3903(of)X
-3992(groups)X
-4232(of)X
-555 4806(related)N
-801(\256les.)X
-1001(In)X
-1095(this)X
-1237(way,)X
-1418(if)X
-1493(the)X
-1617 0.2841(``check-in'')AX
-2028(fails,)X
-2212(the)X
-2336(transaction)X
-2714(may)X
-2878(be)X
-2980(aborted,)X
-3267(backing)X
-3547(out)X
-3675(the)X
-3799(partial)X
-4030(``check-)X
-555 4896(in'')N
-691(leaving)X
-947(the)X
-1065(source)X
-1295(repository)X
-1640(in)X
-1722(a)X
-1778(consistent)X
-2118(state.)X
-755 5019(A)N
-842(second)X
-1094(situation)X
-1398(where)X
-1624(transactions)X
-2036(can)X
-2177(be)X
-2282(used)X
-2458(to)X
-2549(replace)X
-2811(current)X
-3068(ad-hoc)X
-3316(mechanisms)X
-3741(is)X
-3822(in)X
-3912(applications)X
-555 5109(where)N
-776(concurrent)X
-1144(updates)X
-1413(to)X
-1499(a)X
-1559(shared)X
-1793(\256le)X
-1919(are)X
-2042(desired,)X
-2318(but)X
-2444(there)X
-2629(is)X
-2706(logical)X
-2948(consistency)X
-3345(of)X
-3435(the)X
-3556(data)X
-3713(which)X
-3932(needs)X
-4138(to)X
-4223(be)X
-555 5199(preserved.)N
-928(For)X
-1059(example,)X
-1371(when)X
-1565(the)X
-1683(password)X
-2006(\256le)X
-2128(is)X
-2201(updated,)X
-2495(\256le)X
-2617(locking)X
-2877(is)X
-2950(used)X
-3117(to)X
-3199(disallow)X
-3490(concurrent)X
-3854(access.)X
-4120(Tran-)X
-555 5289(saction)N
-804(semantics)X
-1142(on)X
-1244(the)X
-1364(password)X
-1689(\256les)X
-1844(would)X
-2066(allow)X
-2266(concurrent)X
-2632(updates,)X
-2919(while)X
-3119(preserving)X
-3479(the)X
-3598(logical)X
-3837(consistency)X
-4232(of)X
-555 5379(the)N
-681(password)X
-1012(database.)X
-1357(Similarly,)X
-1702(UNIX)X
-1930(utilities)X
-2196(which)X
-2419(rewrite)X
-2674(\256les)X
-2834(face)X
-2996(a)X
-3059(potential)X
-3366(race)X
-3528(condition)X
-3857(between)X
-4152(their)X
-555 5469(rewriting)N
-871(a)X
-929(\256le)X
-1053(and)X
-1191(another)X
-1453(process)X
-1715(reading)X
-1977(the)X
-2096(\256le.)X
-2259(For)X
-2391(example,)X
-2704(the)X
-2823(compiler)X
-3129(\(more)X
-3342(precisely,)X
-3673(the)X
-3792(assembler\))X
-4161(may)X
-8 s
-10 f
-555 5541(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)N
-5 s
-1 f
-727 5619(1)N
-8 s
-763 5644(To)N
-850(appear)X
-1035(in)X
-1101(the)X
-2 f
-1195(Proceedings)X
-1530(of)X
-1596(the)X
-1690(1992)X
-1834(Winter)X
-2024(Usenix)X
-1 f
-2201(,)X
-2233(San)X
-2345(Francisco,)X
-2625(CA,)X
-2746(January)X
-2960(1992.)X
-
-2 p
-%%Page: 2 2
-8 s 8 xH 0 xS 1 f
-10 s
-3 f
-1 f
-555 630(have)N
-737(to)X
-829(rewrite)X
-1087(a)X
-1152(\256le)X
-1283(to)X
-1374(which)X
-1599(it)X
-1672(has)X
-1808(write)X
-2002(permission)X
-2382(in)X
-2473(a)X
-2538(directory)X
-2857(to)X
-2948(which)X
-3173(it)X
-3246(does)X
-3422(not)X
-3553(have)X
-3734(write)X
-3928(permission.)X
-555 720(While)N
-779(the)X
-904(``.o'')X
-1099(\256le)X
-1228(is)X
-1308(being)X
-1513(written,)X
-1787(another)X
-2055(utility)X
-2272(such)X
-2446(as)X
-3 f
-2540(nm)X
-1 f
-2651(\(1\))X
-2772(or)X
-3 f
-2866(ar)X
-1 f
-2942(\(1\))X
-3063(may)X
-3228(read)X
-3394(the)X
-3519(\256le)X
-3648(and)X
-3791(produce)X
-4077(invalid)X
-555 810(results)N
-790(since)X
-981(the)X
-1105(\256le)X
-1233(has)X
-1366(not)X
-1494(been)X
-1672(completely)X
-2054(written.)X
-2347(Currently,)X
-2700(some)X
-2895(utilities)X
-3160(use)X
-3293(special)X
-3542(purpose)X
-3821(code)X
-3998(to)X
-4085(handle)X
-555 900(such)N
-722(cases)X
-912(while)X
-1110(others)X
-1326(ignore)X
-1551(the)X
-1669(problem)X
-1956(and)X
-2092(force)X
-2278(users)X
-2463(to)X
-2545(live)X
-2685(with)X
-2847(the)X
-2965(consequences.)X
-755 1023(In)N
-845(this)X
-983(paper,)X
-1205(we)X
-1322(present)X
-1577(a)X
-1635(simple)X
-1870(library)X
-2106(which)X
-2324(provides)X
-2622(transaction)X
-2996(semantics)X
-3334(\(atomicity,)X
-3705(consistency,)X
-4121(isola-)X
-555 1113(tion,)N
-720(and)X
-857(durability\).)X
-1236(The)X
-1382(4.4BSD)X
-1658(database)X
-1956(access)X
-2182(methods)X
-2473(have)X
-2645(been)X
-2817(modi\256ed)X
-3121(to)X
-3203(use)X
-3330(this)X
-3465(library,)X
-3719(optionally)X
-4063(provid-)X
-555 1203(ing)N
-682(shared)X
-917(buffer)X
-1139(management)X
-1574(between)X
-1867(applications,)X
-2298(locking,)X
-2582(and)X
-2722(transaction)X
-3098(semantics.)X
-3478(Any)X
-3640(UNIX)X
-3865(program)X
-4161(may)X
-555 1293(transaction)N
-930(protect)X
-1176(its)X
-1274(data)X
-1430(by)X
-1532(requesting)X
-1888(transaction)X
-2262(protection)X
-2609(with)X
-2773(the)X
-3 f
-2893(db)X
-1 f
-2981(\(3\))X
-3097(library)X
-3333(or)X
-3422(by)X
-3524(adding)X
-3764(appropriate)X
-4152(calls)X
-555 1383(to)N
-646(the)X
-773(transaction)X
-1154(manager,)X
-1480(buffer)X
-1706(manager,)X
-2032(lock)X
-2199(manager,)X
-2525(and)X
-2670(log)X
-2801(manager.)X
-3147(The)X
-3301(library)X
-3543(routines)X
-3829(may)X
-3995(be)X
-4099(linked)X
-555 1473(into)N
-708(the)X
-834(host)X
-995(application)X
-1379(and)X
-1523(called)X
-1743(by)X
-1851(subroutine)X
-2217(interface,)X
-2547(or)X
-2642(they)X
-2808(may)X
-2974(reside)X
-3194(in)X
-3284(a)X
-3348(separate)X
-3640(server)X
-3865(process.)X
-4174(The)X
-555 1563(server)N
-772(architecture)X
-1172(provides)X
-1468(for)X
-1582(network)X
-1865(access)X
-2091(and)X
-2227(better)X
-2430(protection)X
-2775(mechanisms.)X
-3 f
-555 1749(2.)N
-655(Related)X
-938(Work)X
-1 f
-755 1872(There)N
-1000(has)X
-1164(been)X
-1373(much)X
-1608(discussion)X
-1998(in)X
-2117(recent)X
-2371(years)X
-2597(about)X
-2831(new)X
-3021(transaction)X
-3429(models)X
-3716(and)X
-3888(architectures)X
-555 1962 0.1172([SPEC88][NODI90][CHEN91][MOHA91].)AN
-2009(Much)X
-2220(of)X
-2310(this)X
-2448(work)X
-2636(focuses)X
-2900(on)X
-3003(new)X
-3160(ways)X
-3348(to)X
-3433(model)X
-3656(transactions)X
-4062(and)X
-4201(the)X
-555 2052(interactions)N
-953(between)X
-1245(them,)X
-1449(while)X
-1651(the)X
-1772(work)X
-1960(presented)X
-2291(here)X
-2453(focuses)X
-2717(on)X
-2820(the)X
-2941(implementation)X
-3466(and)X
-3605(performance)X
-4035(of)X
-4125(tradi-)X
-555 2142(tional)N
-757(transaction)X
-1129(techniques)X
-1492(\(write-ahead)X
-1919(logging)X
-2183(and)X
-2319(two-phase)X
-2669(locking\))X
-2956(on)X
-3056(a)X
-3112(standard)X
-3404(operating)X
-3727(system)X
-3969(\(UNIX\).)X
-755 2265(Such)N
-947(traditional)X
-1308(operating)X
-1643(systems)X
-1928(are)X
-2059(often)X
-2256(criticized)X
-2587(for)X
-2713(their)X
-2892(inability)X
-3190(to)X
-3283(perform)X
-3573(transaction)X
-3956(processing)X
-555 2355(adequately.)N
-971([STON81])X
-1342(cites)X
-1517(three)X
-1706(main)X
-1894(areas)X
-2088(of)X
-2183(inadequate)X
-2559(support:)X
-2849(buffer)X
-3074(management,)X
-3532(the)X
-3658(\256le)X
-3788(system,)X
-4058(and)X
-4201(the)X
-555 2445(process)N
-823(structure.)X
-1191(These)X
-1410(arguments)X
-1771(are)X
-1897(summarized)X
-2316(in)X
-2405(table)X
-2587(one.)X
-2769(Fortunately,)X
-3184(much)X
-3388(has)X
-3521(changed)X
-3815(since)X
-4006(1981.)X
-4232(In)X
-555 2535(the)N
-683(area)X
-848(of)X
-945(buffer)X
-1172(management,)X
-1632(most)X
-1817(UNIX)X
-2048(systems)X
-2331(provide)X
-2606(the)X
-2734(ability)X
-2968(to)X
-3060(memory)X
-3357(map)X
-3525(\256les,)X
-3708(thus)X
-3870(obviating)X
-4201(the)X
-555 2625(need)N
-734(for)X
-855(a)X
-918(copy)X
-1101(between)X
-1396(kernel)X
-1624(and)X
-1766(user)X
-1926(space.)X
-2171(If)X
-2251(a)X
-2313(database)X
-2616(system)X
-2864(is)X
-2943(going)X
-3151(to)X
-3239(use)X
-3372(the)X
-3496(\256le)X
-3624(system)X
-3872(buffer)X
-4095(cache,)X
-555 2715(then)N
-719(a)X
-781(system)X
-1029(call)X
-1171(is)X
-1250(required.)X
-1584(However,)X
-1924(if)X
-1998(buffering)X
-2322(is)X
-2400(provided)X
-2710(at)X
-2793(user)X
-2952(level)X
-3133(using)X
-3331(shared)X
-3566(memory,)X
-3878(as)X
-3970(in)X
-4057(LIBTP,)X
-555 2805(buffer)N
-776(management)X
-1210(is)X
-1287(only)X
-1452(as)X
-1542(slow)X
-1716(as)X
-1806(access)X
-2035(to)X
-2120(shared)X
-2353(memory)X
-2643(and)X
-2782(any)X
-2921(replacement)X
-3337(algorithm)X
-3671(may)X
-3832(be)X
-3931(used.)X
-4121(Since)X
-555 2895(multiple)N
-849(processes)X
-1185(can)X
-1325(access)X
-1559(the)X
-1685(shared)X
-1923(data,)X
-2105(prefetching)X
-2499(may)X
-2665(be)X
-2769(accomplished)X
-3238(by)X
-3346(separate)X
-3638(processes)X
-3973(or)X
-4067(threads)X
-555 2985(whose)N
-782(sole)X
-932(purpose)X
-1207(is)X
-1281(to)X
-1364(prefetch)X
-1649(pages)X
-1853(and)X
-1990(wait)X
-2149(on)X
-2250(them.)X
-2471(There)X
-2680(is)X
-2754(still)X
-2894(no)X
-2995(way)X
-3150(to)X
-3233(enforce)X
-3496(write)X
-3682(ordering)X
-3975(other)X
-4161(than)X
-555 3075(keeping)N
-829(pages)X
-1032(in)X
-1114(user)X
-1268(memory)X
-1555(and)X
-1691(using)X
-1884(the)X
-3 f
-2002(fsync)X
-1 f
-2180(\(3\))X
-2294(system)X
-2536(call)X
-2672(to)X
-2754(perform)X
-3033(synchronous)X
-3458(writes.)X
-755 3198(In)N
-845(the)X
-966(area)X
-1124(of)X
-1214(\256le)X
-1339(systems,)X
-1635(the)X
-1756(fast)X
-1895(\256le)X
-2020(system)X
-2265(\(FFS\))X
-2474([MCKU84])X
-2871(allows)X
-3103(allocation)X
-3442(in)X
-3527(units)X
-3704(up)X
-3806(to)X
-3890(64KBytes)X
-4232(as)X
-555 3288(opposed)N
-846(to)X
-932(the)X
-1054(4KByte)X
-1327(and)X
-1466(8KByte)X
-1738(\256gures)X
-1979(quoted)X
-2220(in)X
-2305([STON81].)X
-2711(The)X
-2859(measurements)X
-3341(in)X
-3426(this)X
-3564(paper)X
-3766(were)X
-3946(taken)X
-4143(from)X
-555 3378(an)N
-655(8KByte)X
-928(FFS,)X
-1104(but)X
-1230(as)X
-1320(LIBTP)X
-1565(runs)X
-1726(exclusively)X
-2114(in)X
-2199(user)X
-2356(space,)X
-2578(there)X
-2762(is)X
-2838(nothing)X
-3105(to)X
-3190(prevent)X
-3454(it)X
-3521(from)X
-3700(being)X
-3901(run)X
-4031(on)X
-4134(other)X
-555 3468(UNIX)N
-776(compatible)X
-1152(\256le)X
-1274(systems)X
-1547(\(e.g.)X
-1710(log-structured)X
-2180([ROSE91],)X
-2558(extent-based,)X
-3004(or)X
-3091(multi-block)X
-3484([SELT91]\).)X
-755 3591(Finally,)N
-1029(with)X
-1199(regard)X
-1433(to)X
-1523(the)X
-1648(process)X
-1916(structure,)X
-2244(neither)X
-2494(context)X
-2757(switch)X
-2993(time)X
-3162(nor)X
-3296(scheduling)X
-3670(around)X
-3920(semaphores)X
-555 3681(seems)N
-785(to)X
-881(affect)X
-1099(the)X
-1231(system)X
-1487(performance.)X
-1968(However,)X
-2317(the)X
-2449(implementation)X
-2984(of)X
-3084(semaphores)X
-3496(can)X
-3641(impact)X
-3892(performance)X
-555 3771(tremendously.)N
-1051(This)X
-1213(is)X
-1286(discussed)X
-1613(in)X
-1695(more)X
-1880(detail)X
-2078(in)X
-2160(section)X
-2407(4.3.)X
-755 3894(The)N
-908(Tuxedo)X
-1181(system)X
-1431(from)X
-1615(AT&T)X
-1861(is)X
-1941(a)X
-2004(transaction)X
-2383(manager)X
-2687(which)X
-2910(coordinates)X
-3307(distributed)X
-3676(transaction)X
-4055(commit)X
-555 3984(from)N
-738(a)X
-801(variety)X
-1051(of)X
-1145(different)X
-1449(local)X
-1632(transaction)X
-2011(managers.)X
-2386(At)X
-2493(this)X
-2634(time,)X
-2822(LIBTP)X
-3070(does)X
-3243(not)X
-3371(have)X
-3549(its)X
-3650(own)X
-3814(mechanism)X
-4205(for)X
-555 4074(distributed)N
-942(commit)X
-1231(processing,)X
-1639(but)X
-1786(could)X
-2009(be)X
-2130(used)X
-2322(as)X
-2434(a)X
-2515(local)X
-2716(transaction)X
-3113(agent)X
-3331(by)X
-3455(systems)X
-3752(such)X
-3943(as)X
-4054(Tuxedo)X
-555 4164([ANDR89].)N
-10 f
-863 4393(i)N
-870(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-903 4483(Buffer)N
-1133(Management)X
-10 f
-1672(g)X
-1 f
-1720(Data)X
-1892(must)X
-2067(be)X
-2163(copied)X
-2397(between)X
-2685(kernel)X
-2906(space)X
-3105(and)X
-3241(user)X
-3395(space.)X
-10 f
-1672 4573(g)N
-1 f
-1720(Buffer)X
-1950(pool)X
-2112(access)X
-2338(is)X
-2411(too)X
-2533(slow.)X
-10 f
-1672 4663(g)N
-1 f
-1720(There)X
-1928(is)X
-2001(no)X
-2101(way)X
-2255(to)X
-2337(request)X
-2589(prefetch.)X
-10 f
-1672 4753(g)N
-1 f
-1720(Replacement)X
-2159(is)X
-2232(usually)X
-2483(LRU)X
-2663(which)X
-2879(may)X
-3037(be)X
-3133(suboptimal)X
-3508(for)X
-3622(databases.)X
-10 f
-1672 4843(g)N
-1 f
-1720(There)X
-1928(is)X
-2001(no)X
-2101(way)X
-2255(to)X
-2337(guarantee)X
-2670(write)X
-2855(ordering.)X
-10 f
-863 4853(i)N
-870(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-903 4943(File)N
-1047(System)X
-10 f
-1672(g)X
-1 f
-1720(Allocation)X
-2078(is)X
-2151(done)X
-2327(in)X
-2409(small)X
-2602(blocks)X
-2831(\(usually)X
-3109(4K)X
-3227(or)X
-3314(8K\).)X
-10 f
-1672 5033(g)N
-1 f
-1720(Logical)X
-1985(organization)X
-2406(of)X
-2493(\256les)X
-2646(is)X
-2719(redundantly)X
-3122(expressed.)X
-10 f
-863 5043(i)N
-870(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-903 5133(Process)N
-1168(Structure)X
-10 f
-1672(g)X
-1 f
-1720(Context)X
-1993(switching)X
-2324(and)X
-2460(message)X
-2752(passing)X
-3012(are)X
-3131(too)X
-3253(slow.)X
-10 f
-1672 5223(g)N
-1 f
-1720(A)X
-1798(process)X
-2059(may)X
-2217(be)X
-2313(descheduled)X
-2730(while)X
-2928(holding)X
-3192(a)X
-3248(semaphore.)X
-10 f
-863 5233(i)N
-870(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-863(c)X
-5193(c)Y
-5113(c)Y
-5033(c)Y
-4953(c)Y
-4873(c)Y
-4793(c)Y
-4713(c)Y
-4633(c)Y
-4553(c)Y
-4473(c)Y
-3990 5233(c)N
-5193(c)Y
-5113(c)Y
-5033(c)Y
-4953(c)Y
-4873(c)Y
-4793(c)Y
-4713(c)Y
-4633(c)Y
-4553(c)Y
-4473(c)Y
-3 f
-1156 5446(Table)N
-1371(One:)X
-1560(Shortcomings)X
-2051(of)X
-2138(UNIX)X
-2363(transaction)X
-2770(support)X
-3056(cited)X
-3241(in)X
-3327([STON81].)X
-
-3 p
-%%Page: 3 3
-10 s 10 xH 0 xS 3 f
-1 f
-755 630(The)N
-901(transaction)X
-1274(architecture)X
-1675(presented)X
-2004(in)X
-2087([YOUN91])X
-2474(is)X
-2548(very)X
-2712(similar)X
-2955(to)X
-3038(that)X
-3179(implemented)X
-3618(in)X
-3701(the)X
-3820(LIBTP.)X
-4103(While)X
-555 720([YOUN91])N
-947(presents)X
-1236(a)X
-1298(model)X
-1524(for)X
-1644(providing)X
-1981(transaction)X
-2359(services,)X
-2663(this)X
-2803(paper)X
-3007(focuses)X
-3273(on)X
-3378(the)X
-3501(implementation)X
-4028(and)X
-4169(per-)X
-555 810(formance)N
-881(of)X
-970(a)X
-1028(particular)X
-1358(system.)X
-1642(In)X
-1731(addition,)X
-2034(we)X
-2149(provide)X
-2415(detailed)X
-2690(comparisons)X
-3116(with)X
-3279(alternative)X
-3639(solutions:)X
-3970(traditional)X
-555 900(UNIX)N
-776(services)X
-1055(and)X
-1191(commercial)X
-1590(database)X
-1887(management)X
-2317(systems.)X
-3 f
-555 1086(3.)N
-655(Architecture)X
-1 f
-755 1209(The)N
-906(library)X
-1146(is)X
-1224(designed)X
-1534(to)X
-1621(provide)X
-1891(well)X
-2054(de\256ned)X
-2315(interfaces)X
-2653(to)X
-2740(the)X
-2863(services)X
-3147(required)X
-3440(for)X
-3559(transaction)X
-3936(processing.)X
-555 1299(These)N
-777(services)X
-1066(are)X
-1195(recovery,)X
-1527(concurrency)X
-1955(control,)X
-2232(and)X
-2378(the)X
-2506(management)X
-2946(of)X
-3043(shared)X
-3283(data.)X
-3487(First)X
-3663(we)X
-3787(will)X
-3941(discuss)X
-4201(the)X
-555 1389(design)N
-795(tradeoffs)X
-1112(in)X
-1205(the)X
-1334(selection)X
-1650(of)X
-1748(recovery,)X
-2081(concurrency)X
-2510(control,)X
-2787(and)X
-2933(buffer)X
-3160(management)X
-3600(implementations,)X
-4183(and)X
-555 1479(then)N
-713(we)X
-827(will)X
-971(present)X
-1223(the)X
-1341(overall)X
-1584(library)X
-1818(architecture)X
-2218(and)X
-2354(module)X
-2614(descriptions.)X
-3 f
-555 1665(3.1.)N
-715(Design)X
-966(Tradeoffs)X
-1 f
-3 f
-555 1851(3.1.1.)N
-775(Crash)X
-1004(Recovery)X
-1 f
-755 1974(The)N
-909(recovery)X
-1220(protocol)X
-1516(is)X
-1598(responsible)X
-1992(for)X
-2115(providing)X
-2455(the)X
-2582(transaction)X
-2963(semantics)X
-3308(discussed)X
-3644(earlier.)X
-3919(There)X
-4136(are)X
-4263(a)X
-555 2064(wide)N
-739(range)X
-946(of)X
-1041(recovery)X
-1351(protocols)X
-1677(available)X
-1995([HAER83],)X
-2395(but)X
-2525(we)X
-2647(can)X
-2786(crudely)X
-3054(divide)X
-3281(them)X
-3468(into)X
-3619(two)X
-3766(main)X
-3953(categories.)X
-555 2154(The)N
-706(\256rst)X
-856(category)X
-1159(records)X
-1422(all)X
-1528(modi\256cations)X
-1989(to)X
-2077(the)X
-2201(database)X
-2504(in)X
-2592(a)X
-2653(separate)X
-2942(\256le,)X
-3089(and)X
-3230(uses)X
-3393(this)X
-3533(\256le)X
-3660(\(log\))X
-3841(to)X
-3928(back)X
-4105(out)X
-4232(or)X
-555 2244(reapply)N
-825(these)X
-1019(modi\256cations)X
-1483(if)X
-1561(a)X
-1626(transaction)X
-2007(aborts)X
-2232(or)X
-2328(the)X
-2455(system)X
-2706(crashes.)X
-3012(We)X
-3153(call)X
-3298(this)X
-3442(set)X
-3560(the)X
-3 f
-3687(logging)X
-3963(protocols)X
-1 f
-4279(.)X
-555 2334(The)N
-703(second)X
-949(category)X
-1249(avoids)X
-1481(the)X
-1602(use)X
-1732(of)X
-1822(a)X
-1881(log)X
-2006(by)X
-2109(carefully)X
-2418(controlling)X
-2792(when)X
-2989(data)X
-3146(are)X
-3268(written)X
-3518(to)X
-3603(disk.)X
-3799(We)X
-3934(call)X
-4073(this)X
-4210(set)X
-555 2424(the)N
-3 f
-673(non-logging)X
-1096(protocols)X
-1 f
-1412(.)X
-755 2547(Non-logging)N
-1185(protocols)X
-1504(hold)X
-1666(dirty)X
-1837(buffers)X
-2085(in)X
-2167(main)X
-2347(memory)X
-2634(or)X
-2721(temporary)X
-3071(\256les)X
-3224(until)X
-3390(commit)X
-3654(and)X
-3790(then)X
-3948(force)X
-4134(these)X
-555 2637(pages)N
-769(to)X
-862(disk)X
-1026(at)X
-1115(transaction)X
-1498(commit.)X
-1813(While)X
-2040(we)X
-2165(can)X
-2308(use)X
-2446(temporary)X
-2807(\256les)X
-2971(to)X
-3064(hold)X
-3237(dirty)X
-3418(pages)X
-3631(that)X
-3781(may)X
-3949(need)X
-4131(to)X
-4223(be)X
-555 2727(evicted)N
-810(from)X
-988(memory)X
-1277(during)X
-1508(a)X
-1566(long-running)X
-2006(transaction,)X
-2400(the)X
-2520(only)X
-2684(user-level)X
-3023(mechanism)X
-3410(to)X
-3494(force)X
-3682(pages)X
-3887(to)X
-3971(disk)X
-4126(is)X
-4201(the)X
-3 f
-555 2817(fsync)N
-1 f
-733(\(2\))X
-850(system)X
-1095(call.)X
-1274(Unfortunately,)X
-3 f
-1767(fsync)X
-1 f
-1945(\(2\))X
-2062(is)X
-2138(an)X
-2237(expensive)X
-2581(system)X
-2826(call)X
-2965(in)X
-3050(that)X
-3193(it)X
-3260(forces)X
-3480(all)X
-3583(pages)X
-3789(of)X
-3879(a)X
-3938(\256le)X
-4062(to)X
-4146(disk,)X
-555 2907(and)N
-691(transactions)X
-1094(that)X
-1234(manage)X
-1504(more)X
-1689(than)X
-1847(one)X
-1983(\256le)X
-2105(must)X
-2280(issue)X
-2460(one)X
-2596(call)X
-2732(per)X
-2855(\256le.)X
-755 3030(In)N
-853(addition,)X
-3 f
-1166(fsync)X
-1 f
-1344(\(2\))X
-1469(provides)X
-1776(no)X
-1887(way)X
-2051(to)X
-2143(control)X
-2400(the)X
-2528(order)X
-2728(in)X
-2820(which)X
-3046(dirty)X
-3227(pages)X
-3440(are)X
-3569(written)X
-3826(to)X
-3918(disk.)X
-4121(Since)X
-555 3120(non-logging)N
-976(protocols)X
-1304(must)X
-1489(sometimes)X
-1861(order)X
-2061(writes)X
-2287(carefully)X
-2603([SULL92],)X
-2987(they)X
-3155(are)X
-3284(dif\256cult)X
-3567(to)X
-3659(implement)X
-4030(on)X
-4139(Unix)X
-555 3210(systems.)N
-868(As)X
-977(a)X
-1033(result,)X
-1251(we)X
-1365(have)X
-1537(chosen)X
-1780(to)X
-1862(implement)X
-2224(a)X
-2280(logging)X
-2544(protocol.)X
-755 3333(Logging)N
-1050(protocols)X
-1372(may)X
-1534(be)X
-1634(categorized)X
-2029(based)X
-2236(on)X
-2340(how)X
-2502(information)X
-2904(is)X
-2981(logged)X
-3223(\(physically)X
-3602(or)X
-3692(logically\))X
-4022(and)X
-4161(how)X
-555 3423(much)N
-767(is)X
-854(logged)X
-1106(\(before)X
-1373(images,)X
-1654(after)X
-1836(images)X
-2097(or)X
-2198(both\).)X
-2441(In)X
-3 f
-2542(physical)X
-2855(logging)X
-1 f
-3103(,)X
-3157(images)X
-3417(of)X
-3517(complete)X
-3844(physical)X
-4144(units)X
-555 3513(\(pages)N
-786(or)X
-874(buffers\))X
-1150(are)X
-1270(recorded,)X
-1593(while)X
-1792(in)X
-3 f
-1875(logical)X
-2118(logging)X
-1 f
-2387(a)X
-2444(description)X
-2820(of)X
-2907(the)X
-3025(operation)X
-3348(is)X
-3421(recorded.)X
-3763(Therefore,)X
-4121(while)X
-555 3603(we)N
-675(may)X
-839(record)X
-1071(entire)X
-1280(pages)X
-1489(in)X
-1577(a)X
-1639(physical)X
-1932(log,)X
-2080(we)X
-2200(need)X
-2378(only)X
-2546(record)X
-2777(the)X
-2900(records)X
-3162(being)X
-3365(modi\256ed)X
-3674(in)X
-3761(a)X
-3822(logical)X
-4065(log.)X
-4232(In)X
-555 3693(fact,)N
-718(physical)X
-1006(logging)X
-1271(can)X
-1404(be)X
-1501(thought)X
-1766(of)X
-1854(as)X
-1942(a)X
-1999(special)X
-2243(case)X
-2403(of)X
-2491(logical)X
-2730(logging,)X
-3015(since)X
-3201(the)X
-3320 0.3125(``records'')AX
-3686(that)X
-3827(we)X
-3942(log)X
-4065(in)X
-4148(logi-)X
-555 3783(cal)N
-673(logging)X
-941(might)X
-1151(be)X
-1251(physical)X
-1542(pages.)X
-1789(Since)X
-1991(logical)X
-2233(logging)X
-2501(is)X
-2578(both)X
-2743(more)X
-2931(space-ef\256cient)X
-3423(and)X
-3562(more)X
-3750(general,)X
-4030(we)X
-4147(have)X
-555 3873(chosen)N
-798(it)X
-862(for)X
-976(our)X
-1103(logging)X
-1367(protocol.)X
-755 3996(In)N
-3 f
-843(before-image)X
-1315(logging)X
-1 f
-1563(,)X
-1604(we)X
-1719(log)X
-1842(a)X
-1899(copy)X
-2076(of)X
-2164(the)X
-2283(data)X
-2438(before)X
-2665(the)X
-2784(update,)X
-3039(while)X
-3238(in)X
-3 f
-3321(after-image)X
-3739(logging)X
-1 f
-3987(,)X
-4027(we)X
-4141(log)X
-4263(a)X
-555 4086(copy)N
-740(of)X
-836(the)X
-963(data)X
-1126(after)X
-1303(the)X
-1429(update.)X
-1711(If)X
-1793(we)X
-1915(log)X
-2045(only)X
-2215(before-images,)X
-2723(then)X
-2889(there)X
-3078(is)X
-3159(suf\256cient)X
-3485(information)X
-3891(in)X
-3981(the)X
-4107(log)X
-4237(to)X
-555 4176(allow)N
-761(us)X
-860(to)X
-3 f
-950(undo)X
-1 f
-1150(the)X
-1276(transaction)X
-1656(\(go)X
-1791(back)X
-1971(to)X
-2061(the)X
-2187(state)X
-2361(represented)X
-2759(by)X
-2866(the)X
-2991(before-image\).)X
-3514(However,)X
-3876(if)X
-3952(the)X
-4077(system)X
-555 4266(crashes)N
-814(and)X
-952(a)X
-1010(committed)X
-1374(transaction's)X
-1806(changes)X
-2087(have)X
-2261(not)X
-2385(reached)X
-2658(the)X
-2778(disk,)X
-2953(we)X
-3068(have)X
-3241(no)X
-3342(means)X
-3568(to)X
-3 f
-3651(redo)X
-1 f
-3828(the)X
-3947(transaction)X
-555 4356(\(reapply)N
-849(the)X
-973(updates\).)X
-1311(Therefore,)X
-1675(logging)X
-1945(only)X
-2113(before-images)X
-2599(necessitates)X
-3004(forcing)X
-3262(dirty)X
-3439(pages)X
-3648(at)X
-3732(commit)X
-4002(time.)X
-4210(As)X
-555 4446(mentioned)N
-913(above,)X
-1145(forcing)X
-1397(pages)X
-1600(at)X
-1678(commit)X
-1942(is)X
-2015(considered)X
-2383(too)X
-2505(costly.)X
-755 4569(If)N
-834(we)X
-953(log)X
-1080(only)X
-1247(after-images,)X
-1694(then)X
-1857(there)X
-2043(is)X
-2121(suf\256cient)X
-2444(information)X
-2847(in)X
-2934(the)X
-3057(log)X
-3184(to)X
-3271(allow)X
-3474(us)X
-3570(to)X
-3657(redo)X
-3825(the)X
-3947(transaction)X
-555 4659(\(go)N
-687(forward)X
-967(to)X
-1054(the)X
-1177(state)X
-1348(represented)X
-1743(by)X
-1847(the)X
-1969(after-image\),)X
-2411(but)X
-2537(we)X
-2655(do)X
-2759(not)X
-2885(have)X
-3061(the)X
-3183(information)X
-3585(required)X
-3877(to)X
-3963(undo)X
-4147(tran-)X
-555 4749(sactions)N
-845(which)X
-1073(aborted)X
-1346(after)X
-1526(dirty)X
-1709(pages)X
-1924(were)X
-2113(written)X
-2372(to)X
-2466(disk.)X
-2670(Therefore,)X
-3039(logging)X
-3314(only)X
-3487(after-images)X
-3920(necessitates)X
-555 4839(holding)N
-819(all)X
-919(dirty)X
-1090(buffers)X
-1338(in)X
-1420(main)X
-1600(memory)X
-1887(until)X
-2053(commit)X
-2317(or)X
-2404(writing)X
-2655(them)X
-2835(to)X
-2917(a)X
-2973(temporary)X
-3323(\256le.)X
-755 4962(Since)N
-956(neither)X
-1202(constraint)X
-1541(\(forcing)X
-1823(pages)X
-2029(on)X
-2132(commit)X
-2399(or)X
-2489(buffering)X
-2811(pages)X
-3016(until)X
-3184(commit\))X
-3477(was)X
-3624(feasible,)X
-3916(we)X
-4032(chose)X
-4237(to)X
-555 5052(log)N
-683(both)X
-851(before)X
-1083(and)X
-1225(after)X
-1399(images.)X
-1672(The)X
-1823(only)X
-1991(remaining)X
-2342(consideration)X
-2800(is)X
-2879(when)X
-3079(changes)X
-3363(get)X
-3486(written)X
-3738(to)X
-3825(disk.)X
-4023(Changes)X
-555 5142(affect)N
-764(both)X
-931(data)X
-1090(pages)X
-1298(and)X
-1438(the)X
-1560(log.)X
-1726(If)X
-1804(the)X
-1926(changed)X
-2218(data)X
-2376(page)X
-2552(is)X
-2629(written)X
-2880(before)X
-3110(the)X
-3232(log)X
-3358(page,)X
-3554(and)X
-3694(the)X
-3816(system)X
-4062(crashes)X
-555 5232(before)N
-787(the)X
-911(log)X
-1039(page)X
-1217(is)X
-1296(written,)X
-1569(the)X
-1693(log)X
-1820(will)X
-1969(contain)X
-2230(insuf\256cient)X
-2615(information)X
-3018(to)X
-3105(undo)X
-3290(the)X
-3413(change.)X
-3706(This)X
-3873(violates)X
-4147(tran-)X
-555 5322(saction)N
-803(semantics,)X
-1160(since)X
-1346(some)X
-1536(changed)X
-1825(data)X
-1980(pages)X
-2184(may)X
-2343(not)X
-2466(have)X
-2638(been)X
-2810(written,)X
-3077(and)X
-3213(the)X
-3331(database)X
-3628(cannot)X
-3862(be)X
-3958(restored)X
-4237(to)X
-555 5412(its)N
-650(pre-transaction)X
-1152(state.)X
-755 5535(The)N
-914(log)X
-1050(record)X
-1290(describing)X
-1658(an)X
-1768(update)X
-2016(must)X
-2205(be)X
-2315(written)X
-2576(to)X
-2672(stable)X
-2893(storage)X
-3159(before)X
-3398(the)X
-3529(modi\256ed)X
-3846(page.)X
-4071(This)X
-4246(is)X
-3 f
-555 5625(write-ahead)N
-992(logging)X
-1 f
-1240(.)X
-1307(If)X
-1388(log)X
-1517(records)X
-1781(are)X
-1907(safely)X
-2126(written)X
-2380(to)X
-2469(disk,)X
-2649(data)X
-2810(pages)X
-3020(may)X
-3185(be)X
-3288(written)X
-3542(at)X
-3627(any)X
-3770(time)X
-3939(afterwards.)X
-555 5715(This)N
-721(means)X
-950(that)X
-1094(the)X
-1216(only)X
-1382(\256le)X
-1508(that)X
-1652(ever)X
-1815(needs)X
-2022(to)X
-2108(be)X
-2208(forced)X
-2438(to)X
-2524(disk)X
-2681(is)X
-2758(the)X
-2880(log.)X
-3046(Since)X
-3248(the)X
-3370(log)X
-3495(is)X
-3571(append-only,)X
-4015(modi\256ed)X
-
-4 p
-%%Page: 4 4
-10 s 10 xH 0 xS 1 f
-3 f
-1 f
-555 630(pages)N
-760(always)X
-1005(appear)X
-1242(at)X
-1322(the)X
-1442(end)X
-1580(and)X
-1718(may)X
-1878(be)X
-1976(written)X
-2224(to)X
-2307(disk)X
-2461(ef\256ciently)X
-2807(in)X
-2890(any)X
-3027(\256le)X
-3150(system)X
-3393(that)X
-3534(favors)X
-3756(sequential)X
-4102(order-)X
-555 720(ing)N
-677(\()X
-2 f
-704(e.g.)X
-1 f
-820(,)X
-860(FFS,)X
-1032(log-structured)X
-1502(\256le)X
-1624(system,)X
-1886(or)X
-1973(an)X
-2069(extent-based)X
-2495(system\).)X
-3 f
-555 906(3.1.2.)N
-775(Concurrency)X
-1245(Control)X
-1 f
-755 1029(The)N
-918(concurrency)X
-1354(control)X
-1619(protocol)X
-1923(is)X
-2013(responsible)X
-2415(for)X
-2546(maintaining)X
-2965(consistency)X
-3376(in)X
-3475(the)X
-3610(presence)X
-3929(of)X
-4033(multiple)X
-555 1119(accesses.)N
-897(There)X
-1114(are)X
-1242(several)X
-1499(alternative)X
-1867(solutions)X
-2183(such)X
-2358(as)X
-2453(locking,)X
-2741(optimistic)X
-3088(concurrency)X
-3514(control)X
-3769([KUNG81],)X
-4183(and)X
-555 1209(timestamp)N
-912(ordering)X
-1208([BERN80].)X
-1619(Since)X
-1821(optimistic)X
-2164(methods)X
-2459(and)X
-2599(timestamp)X
-2956(ordering)X
-3252(are)X
-3374(generally)X
-3696(more)X
-3884(complex)X
-4183(and)X
-555 1299(restrict)N
-804(concurrency)X
-1228(without)X
-1498(eliminating)X
-1888(starvation)X
-2230(or)X
-2323(deadlocks,)X
-2690(we)X
-2810(chose)X
-3018(two-phase)X
-3373(locking)X
-3638(\(2PL\).)X
-3890(Strict)X
-4088(2PL)X
-4246(is)X
-555 1389(suboptimal)N
-935(for)X
-1054(certain)X
-1297(data)X
-1455(structures)X
-1791(such)X
-1962(as)X
-2053(B-trees)X
-2309(because)X
-2588(it)X
-2656(can)X
-2792(limit)X
-2966(concurrency,)X
-3408(so)X
-3503(we)X
-3621(use)X
-3752(a)X
-3812(special)X
-4059(locking)X
-555 1479(protocol)N
-842(based)X
-1045(on)X
-1145(one)X
-1281(described)X
-1609(in)X
-1691([LEHM81].)X
-755 1602(The)N
-901(B-tree)X
-1123(locking)X
-1384(protocol)X
-1672(we)X
-1787(implemented)X
-2226(releases)X
-2502(locks)X
-2691(at)X
-2769(internal)X
-3034(nodes)X
-3241(in)X
-3323(the)X
-3441(tree)X
-3582(as)X
-3669(it)X
-3733(descends.)X
-4083(A)X
-4161(lock)X
-555 1692(on)N
-658(an)X
-757(internal)X
-1025(page)X
-1200(is)X
-1276(always)X
-1522(released)X
-1808(before)X
-2036(a)X
-2094(lock)X
-2254(on)X
-2356(its)X
-2453(child)X
-2635(is)X
-2710(obtained)X
-3008(\(that)X
-3177(is,)X
-3272(locks)X
-3463(are)X
-3584(not)X
-3 f
-3708(coupled)X
-1 f
-3996([BAY77])X
-555 1782(during)N
-786(descent\).)X
-1116(When)X
-1330(a)X
-1388(leaf)X
-1531(\(or)X
-1647(internal\))X
-1941(page)X
-2115(is)X
-2190(split,)X
-2369(a)X
-2427(write)X
-2614(lock)X
-2774(is)X
-2849(acquired)X
-3148(on)X
-3250(the)X
-3370(parent)X
-3593(before)X
-3821(the)X
-3941(lock)X
-4100(on)X
-4201(the)X
-555 1872(just-split)N
-855(page)X
-1028(is)X
-1102(released)X
-1387(\(locks)X
-1604(are)X
-3 f
-1724(coupled)X
-1 f
-2011(during)X
-2241(ascent\).)X
-2530(Write)X
-2734(locks)X
-2924(on)X
-3025(internal)X
-3291(pages)X
-3495(are)X
-3615(released)X
-3899(immediately)X
-555 1962(after)N
-723(the)X
-841(page)X
-1013(is)X
-1086(updated,)X
-1380(but)X
-1502(locks)X
-1691(on)X
-1791(leaf)X
-1932(pages)X
-2135(are)X
-2254(held)X
-2412(until)X
-2578(the)X
-2696(end)X
-2832(of)X
-2919(the)X
-3037(transaction.)X
-755 2085(Since)N
-964(locks)X
-1164(are)X
-1294(released)X
-1589(during)X
-1828(descent,)X
-2119(the)X
-2247(structure)X
-2558(of)X
-2655(the)X
-2783(tree)X
-2934(may)X
-3102(change)X
-3360(above)X
-3582(a)X
-3648(node)X
-3834(being)X
-4042(used)X
-4219(by)X
-555 2175(some)N
-752(process.)X
-1061(If)X
-1143(that)X
-1291(process)X
-1560(must)X
-1743(later)X
-1914(ascend)X
-2161(the)X
-2287(tree)X
-2435(because)X
-2717(of)X
-2811(a)X
-2874(page)X
-3053(split,)X
-3237(any)X
-3380(such)X
-3554(change)X
-3809(must)X
-3991(not)X
-4120(cause)X
-555 2265(confusion.)N
-938(We)X
-1077(use)X
-1211(the)X
-1336(technique)X
-1675(described)X
-2010(in)X
-2099([LEHM81])X
-2487(which)X
-2710(exploits)X
-2989(the)X
-3113(ordering)X
-3411(of)X
-3504(data)X
-3664(on)X
-3770(a)X
-3832(B-tree)X
-4059(page)X
-4237(to)X
-555 2355(guarantee)N
-888(that)X
-1028(no)X
-1128(process)X
-1389(ever)X
-1548(gets)X
-1697(lost)X
-1832(as)X
-1919(a)X
-1975(result)X
-2173(of)X
-2260(internal)X
-2525(page)X
-2697(updates)X
-2962(made)X
-3156(by)X
-3256(other)X
-3441(processes.)X
-755 2478(If)N
-836(a)X
-899(transaction)X
-1278(that)X
-1425(updates)X
-1697(a)X
-1760(B-tree)X
-1988(aborts,)X
-2231(the)X
-2356(user-visible)X
-2757(changes)X
-3043(to)X
-3131(the)X
-3255(tree)X
-3402(must)X
-3583(be)X
-3685(rolled)X
-3898(back.)X
-4116(How-)X
-555 2568(ever,)N
-735(changes)X
-1015(to)X
-1097(the)X
-1215(internal)X
-1480(nodes)X
-1687(of)X
-1774(the)X
-1892(tree)X
-2033(need)X
-2205(not)X
-2327(be)X
-2423(rolled)X
-2630(back,)X
-2822(since)X
-3007(these)X
-3192(pages)X
-3395(contain)X
-3651(no)X
-3751(user-visible)X
-4145(data.)X
-555 2658(When)N
-771(rolling)X
-1008(back)X
-1184(a)X
-1244(transaction,)X
-1640(we)X
-1758(roll)X
-1893(back)X
-2069(all)X
-2173(leaf)X
-2318(page)X
-2494(updates,)X
-2783(but)X
-2909(no)X
-3013(internal)X
-3281(insertions)X
-3615(or)X
-3705(page)X
-3880(splits.)X
-4111(In)X
-4201(the)X
-555 2748(worst)N
-759(case,)X
-944(this)X
-1085(will)X
-1235(leave)X
-1431(a)X
-1493(leaf)X
-1640(page)X
-1818(less)X
-1964(than)X
-2128(half)X
-2279(full.)X
-2456(This)X
-2624(may)X
-2788(cause)X
-2993(poor)X
-3166(space)X
-3371(utilization,)X
-3741(but)X
-3869(does)X
-4042(not)X
-4170(lose)X
-555 2838(user)N
-709(data.)X
-755 2961(Holding)N
-1038(locks)X
-1228(on)X
-1329(leaf)X
-1471(pages)X
-1675(until)X
-1842(transaction)X
-2215(commit)X
-2480(guarantees)X
-2845(that)X
-2986(no)X
-3087(other)X
-3273(process)X
-3535(can)X
-3668(insert)X
-3866(or)X
-3953(delete)X
-4165(data)X
-555 3051(that)N
-711(has)X
-854(been)X
-1042(touched)X
-1332(by)X
-1448(this)X
-1598(process.)X
-1914(Rolling)X
-2188(back)X
-2375(insertions)X
-2721(and)X
-2872(deletions)X
-3196(on)X
-3311(leaf)X
-3467(pages)X
-3685(guarantees)X
-4064(that)X
-4219(no)X
-555 3141(aborted)N
-819(updates)X
-1087(are)X
-1209(ever)X
-1371(visible)X
-1607(to)X
-1692(other)X
-1880(transactions.)X
-2326(Leaving)X
-2612(page)X
-2787(splits)X
-2978(intact)X
-3179(permits)X
-3442(us)X
-3536(to)X
-3621(release)X
-3867(internal)X
-4134(write)X
-555 3231(locks)N
-744(early.)X
-965(Thus)X
-1145(transaction)X
-1517(semantics)X
-1853(are)X
-1972(preserved,)X
-2325(and)X
-2461(locks)X
-2650(are)X
-2769(held)X
-2927(for)X
-3041(shorter)X
-3284(periods.)X
-755 3354(The)N
-901(extra)X
-1083(complexity)X
-1464(introduced)X
-1828(by)X
-1929(this)X
-2065(locking)X
-2326(protocol)X
-2614(appears)X
-2881(substantial,)X
-3264(but)X
-3387(it)X
-3452(is)X
-3525(important)X
-3856(for)X
-3970(multi-user)X
-555 3444(execution.)N
-950(The)X
-1118(bene\256ts)X
-1410(of)X
-1520(non-two-phase)X
-2040(locking)X
-2323(on)X
-2446(B-trees)X
-2721(are)X
-2863(well)X
-3044(established)X
-3443(in)X
-3548(the)X
-3689(database)X
-4009(literature)X
-555 3534([BAY77],)N
-899([LEHM81].)X
-1320(If)X
-1394(a)X
-1450(process)X
-1711(held)X
-1869(locks)X
-2058(until)X
-2224(it)X
-2288(committed,)X
-2670(then)X
-2828(a)X
-2884(long-running)X
-3322(update)X
-3556(could)X
-3754(lock)X
-3912(out)X
-4034(all)X
-4134(other)X
-555 3624(transactions)N
-967(by)X
-1076(preventing)X
-1448(any)X
-1593(other)X
-1787(process)X
-2057(from)X
-2241(locking)X
-2509(the)X
-2635(root)X
-2792(page)X
-2972(of)X
-3067(the)X
-3193(tree.)X
-3382(The)X
-3535(B-tree)X
-3764(locking)X
-4032(protocol)X
-555 3714(described)N
-884(above)X
-1096(guarantees)X
-1460(that)X
-1600(locks)X
-1789(on)X
-1889(internal)X
-2154(pages)X
-2357(are)X
-2476(held)X
-2634(for)X
-2748(extremely)X
-3089(short)X
-3269(periods,)X
-3545(thereby)X
-3806(increasing)X
-4156(con-)X
-555 3804(currency.)N
-3 f
-555 3990(3.1.3.)N
-775(Management)X
-1245(of)X
-1332(Shared)X
-1596(Data)X
-1 f
-755 4113(Database)N
-1075(systems)X
-1353(permit)X
-1587(many)X
-1790(users)X
-1980(to)X
-2067(examine)X
-2364(and)X
-2505(update)X
-2744(the)X
-2866(same)X
-3055(data)X
-3213(concurrently.)X
-3683(In)X
-3774(order)X
-3968(to)X
-4054(provide)X
-555 4203(this)N
-702(concurrent)X
-1078(access)X
-1316(and)X
-1464(enforce)X
-1738(the)X
-1868(write-ahead)X
-2280(logging)X
-2556(protocol)X
-2855(described)X
-3195(in)X
-3289(section)X
-3548(3.1.1,)X
-3759(we)X
-3884(use)X
-4022(a)X
-4089(shared)X
-555 4293(memory)N
-848(buffer)X
-1071(manager.)X
-1414(Not)X
-1559(only)X
-1726(does)X
-1898(this)X
-2038(provide)X
-2308(the)X
-2431(guarantees)X
-2800(we)X
-2919(require,)X
-3192(but)X
-3319(a)X
-3380(user-level)X
-3722(buffer)X
-3944(manager)X
-4246(is)X
-555 4383(frequently)N
-916(faster)X
-1126(than)X
-1295(using)X
-1498(the)X
-1626(\256le)X
-1758(system)X
-2010(buffer)X
-2237(cache.)X
-2491(Reads)X
-2717(or)X
-2814(writes)X
-3040(involving)X
-3376(the)X
-3504(\256le)X
-3636(system)X
-3888(buffer)X
-4115(cache)X
-555 4473(often)N
-746(require)X
-1000(copying)X
-1284(data)X
-1444(between)X
-1738(user)X
-1898(and)X
-2040(kernel)X
-2266(space)X
-2470(while)X
-2673(a)X
-2734(user-level)X
-3076(buffer)X
-3298(manager)X
-3600(can)X
-3737(return)X
-3954(pointers)X
-4237(to)X
-555 4563(data)N
-709(pages)X
-912(directly.)X
-1217(Additionally,)X
-1661(if)X
-1730(more)X
-1915(than)X
-2073(one)X
-2209(process)X
-2470(uses)X
-2628(the)X
-2746(same)X
-2931(page,)X
-3123(then)X
-3281(fewer)X
-3485(copies)X
-3710(may)X
-3868(be)X
-3964(required.)X
-3 f
-555 4749(3.2.)N
-715(Module)X
-997(Architecture)X
-1 f
-755 4872(The)N
-913(preceding)X
-1262(sections)X
-1552(described)X
-1892(modules)X
-2195(for)X
-2321(managing)X
-2669(the)X
-2799(transaction)X
-3183(log,)X
-3337(locks,)X
-3558(and)X
-3706(a)X
-3774(cache)X
-3990(of)X
-4089(shared)X
-555 4962(buffers.)N
-847(In)X
-938(addition,)X
-1244(we)X
-1362(need)X
-1538(to)X
-1624(provide)X
-1893(functionality)X
-2326(for)X
-2444(transaction)X
-2 f
-2819(begin)X
-1 f
-2997(,)X
-2 f
-3040(commit)X
-1 f
-3276(,)X
-3319(and)X
-2 f
-3458(abort)X
-1 f
-3654(processing,)X
-4040(necessi-)X
-555 5052(tating)N
-769(a)X
-837(transaction)X
-1221(manager.)X
-1570(In)X
-1669(order)X
-1871(to)X
-1965(arbitrate)X
-2265(concurrent)X
-2641(access)X
-2879(to)X
-2973(locks)X
-3173(and)X
-3320(buffers,)X
-3599(we)X
-3724(include)X
-3991(a)X
-4058(process)X
-555 5142(management)N
-995(module)X
-1264(which)X
-1489(manages)X
-1799(a)X
-1864(collection)X
-2209(of)X
-2305(semaphores)X
-2713(used)X
-2889(to)X
-2980(block)X
-3187(and)X
-3332(release)X
-3585(processes.)X
-3962(Finally,)X
-4237(in)X
-555 5232(order)N
-752(to)X
-841(provide)X
-1113(a)X
-1176(simple,)X
-1436(standard)X
-1735(interface)X
-2044(we)X
-2165(have)X
-2344(modi\256ed)X
-2655(the)X
-2780(database)X
-3084(access)X
-3317(routines)X
-3602(\()X
-3 f
-3629(db)X
-1 f
-3717(\(3\)\).)X
-3904(For)X
-4041(the)X
-4165(pur-)X
-555 5322(poses)N
-758(of)X
-850(this)X
-990(paper)X
-1194(we)X
-1313(call)X
-1453(the)X
-1575(modi\256ed)X
-1883(package)X
-2171(the)X
-3 f
-2293(Record)X
-2567(Manager)X
-1 f
-2879(.)X
-2943(Figure)X
-3176(one)X
-3316(shows)X
-3540(the)X
-3662(main)X
-3846(interfaces)X
-4183(and)X
-555 5412(architecture)N
-955(of)X
-1042(LIBTP.)X
-
-5 p
-%%Page: 5 5
-10 s 10 xH 0 xS 1 f
-3 f
-1 f
-11 s
-1851 1520(log_commit)N
-2764 2077(buf_unpin)N
-2764 1987(buf_get)N
-3633 1408(buf_unpin)N
-3633 1319(buf_pin)N
-3633 1230(buf_get)N
-3 f
-17 s
-1163 960(Txn)N
-1430(M)X
-1559(anager)X
-2582(Record)X
-3040(M)X
-3169(anager)X
-1 Dt
-2363 726 MXY
-0 355 Dl
-1426 0 Dl
-0 -355 Dl
--1426 0 Dl
-3255 1616 MXY
-0 535 Dl
-534 0 Dl
-0 -535 Dl
--534 0 Dl
-2185 MX
-0 535 Dl
-535 0 Dl
-0 -535 Dl
--535 0 Dl
-1116 MX
-0 535 Dl
-534 0 Dl
-0 -535 Dl
--534 0 Dl
-726 MY
-0 355 Dl
-891 0 Dl
-0 -355 Dl
--891 0 Dl
-1 f
-11 s
-2207 1297(lock)N
-2564 1386(log)N
-865(unlock_all)X
-1851 1609(log_unroll)N
-1650 2508 MXY
-0 178 Dl
-1605 0 Dl
-0 -178 Dl
--1605 0 Dl
-1294 1616 MXY
-19 -30 Dl
--19 11 Dl
--20 -11 Dl
-20 30 Dl
-0 -535 Dl
-2319 2508 MXY
--22 -30 Dl
-4 23 Dl
--18 14 Dl
-36 -7 Dl
--936 -357 Dl
-3277 2455(sleep_on)N
-1405 1616 MXY
-36 4 Dl
--18 -13 Dl
-1 -22 Dl
--19 31 Dl
-1070 -535 Dl
-2631 2508 MXY
-36 6 Dl
--18 -14 Dl
-3 -22 Dl
--21 30 Dl
-891 -357 Dl
-1426 2455(sleep_on)N
-3255 1884 MXY
--31 -20 Dl
-11 20 Dl
--11 19 Dl
-31 -19 Dl
--535 0 Dl
-1554 2366(wake)N
-3277(wake)X
-2185 1884 MXY
--31 -20 Dl
-12 20 Dl
--12 19 Dl
-31 -19 Dl
--356 0 Dl
-0 -803 Dl
-3 f
-17 s
-1236 1851(Lock)N
-1118 2030(M)N
-1247(anager)X
-2339 1851(Log)N
-2187 2030(M)N
-2316(anager)X
-3333 1851(Buffer)N
-3257 2030(M)N
-3386(anager)X
-3522 1616 MXY
-20 -30 Dl
--20 11 Dl
--20 -11 Dl
-20 30 Dl
-0 -535 Dl
-1950 2654(Process)N
-2424(M)X
-2553(anager)X
-2542 1616 MXY
-19 -30 Dl
--19 11 Dl
--20 -11 Dl
-20 30 Dl
-0 -535 Dl
-1 f
-11 s
-2207 1364(unlock)N
-2452 2508 MXY
-20 -31 Dl
--20 11 Dl
--19 -11 Dl
-19 31 Dl
-0 -357 Dl
-2497 2322(sleep_on)N
-2497 2233(wake)N
-3 Dt
--1 Ds
-3 f
-10 s
-1790 2830(Figure)N
-2037(1:)X
-2144(Library)X
-2435(module)X
-2708(interfaces.)X
-1 f
-10 f
-555 3010(h)N
-579(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)X
-3 f
-555 3286(3.2.1.)N
-775(The)X
-928(Log)X
-1081(Manager)X
-1 f
-755 3409(The)N
-3 f
-907(Log)X
-1067(Manager)X
-1 f
-1406(enforces)X
-1706(the)X
-1831(write-ahead)X
-2238(logging)X
-2509(protocol.)X
-2843(Its)X
-2949(primitive)X
-3268(operations)X
-3628(are)X
-2 f
-3753(log)X
-1 f
-3855(,)X
-2 f
-3901(log_commit)X
-1 f
-4279(,)X
-2 f
-555 3499(log_read)N
-1 f
-844(,)X
-2 f
-889(log_roll)X
-1 f
-1171(and)X
-2 f
-1312(log_unroll)X
-1 f
-1649(.)X
-1714(The)X
-2 f
-1864(log)X
-1 f
-1991(call)X
-2132(performs)X
-2447(a)X
-2508(buffered)X
-2806(write)X
-2996(of)X
-3088(the)X
-3211(speci\256ed)X
-3520(log)X
-3646(record)X
-3876(and)X
-4016(returns)X
-4263(a)X
-555 3589(unique)N
-809(log)X
-947(sequence)X
-1278(number)X
-1559(\(LSN\).)X
-1840(This)X
-2017(LSN)X
-2203(may)X
-2376(then)X
-2549(be)X
-2660(used)X
-2842(to)X
-2939(retrieve)X
-3220(a)X
-3291(record)X
-3532(from)X
-3723(the)X
-3856(log)X
-3993(using)X
-4201(the)X
-2 f
-555 3679(log_read)N
-1 f
-865(call.)X
-1042(The)X
-2 f
-1188(log)X
-1 f
-1311(interface)X
-1614(knows)X
-1844(very)X
-2008(little)X
-2175(about)X
-2374(the)X
-2493(internal)X
-2759(format)X
-2993(of)X
-3080(the)X
-3198(log)X
-3320(records)X
-3577(it)X
-3641(receives.)X
-3965(Rather,)X
-4219(all)X
-555 3769(log)N
-681(records)X
-942(are)X
-1065 0.4028(referenced)AX
-1430(by)X
-1534(a)X
-1594(header)X
-1833(structure,)X
-2158(a)X
-2218(log)X
-2344(record)X
-2574(type,)X
-2756(and)X
-2896(a)X
-2956(character)X
-3276(buffer)X
-3497(containing)X
-3859(the)X
-3981(data)X
-4138(to)X
-4223(be)X
-555 3859(logged.)N
-834(The)X
-980(log)X
-1103(record)X
-1330(type)X
-1489(is)X
-1563(used)X
-1731(to)X
-1814(call)X
-1951(the)X
-2070(appropriate)X
-2457(redo)X
-2621(and)X
-2758(undo)X
-2939(routines)X
-3217(during)X
-2 f
-3446(abort)X
-1 f
-3639(and)X
-2 f
-3775(commit)X
-1 f
-4031(process-)X
-555 3949(ing.)N
-721(While)X
-941(we)X
-1059(have)X
-1235(used)X
-1406(the)X
-3 f
-1528(Log)X
-1684(Manager)X
-1 f
-2019(to)X
-2104(provide)X
-2372(before)X
-2601(and)X
-2740(after)X
-2911(image)X
-3130(logging,)X
-3417(it)X
-3484(may)X
-3645(also)X
-3797(be)X
-3896(used)X
-4066(for)X
-4183(any)X
-555 4039(of)N
-642(the)X
-760(logging)X
-1024(algorithms)X
-1386(discussed.)X
-755 4162(The)N
-2 f
-905(log_commit)X
-1 f
-1308(operation)X
-1636(behaves)X
-1920(exactly)X
-2177(like)X
-2322(the)X
-2 f
-2445(log)X
-1 f
-2572(operation)X
-2900(but)X
-3026(guarantees)X
-3394(that)X
-3538(the)X
-3660(log)X
-3786(has)X
-3917(been)X
-4093(forced)X
-555 4252(to)N
-643(disk)X
-802(before)X
-1034(returning.)X
-1394(A)X
-1478(discussion)X
-1837(of)X
-1930(our)X
-2063(commit)X
-2333(strategy)X
-2613(appears)X
-2884(in)X
-2971(the)X
-3094(implementation)X
-3621(section)X
-3873(\(section)X
-4152(4.2\).)X
-2 f
-555 4342(Log_unroll)N
-1 f
-935(reads)X
-1126(log)X
-1249(records)X
-1507(from)X
-1684(the)X
-1803(log,)X
-1946(following)X
-2278(backward)X
-2611(transaction)X
-2983(pointers)X
-3261(and)X
-3397(calling)X
-3635(the)X
-3753(appropriate)X
-4139(undo)X
-555 4432(routines)N
-839(to)X
-927(implement)X
-1295(transaction)X
-1673(abort.)X
-1904(In)X
-1997(a)X
-2059(similar)X
-2307(manner,)X
-2 f
-2594(log_roll)X
-1 f
-2877(reads)X
-3073(log)X
-3201(records)X
-3464(sequentially)X
-3877(forward,)X
-4178(cal-)X
-555 4522(ling)N
-699(the)X
-817(appropriate)X
-1203(redo)X
-1366(routines)X
-1644(to)X
-1726(recover)X
-1988(committed)X
-2350(transactions)X
-2753(after)X
-2921(a)X
-2977(system)X
-3219(crash.)X
-3 f
-555 4708(3.2.2.)N
-775(The)X
-928(Buffer)X
-1171(Manager)X
-1 f
-755 4831(The)N
-3 f
-912(Buffer)X
-1167(Manager)X
-1 f
-1511(uses)X
-1681(a)X
-1749(pool)X
-1923(of)X
-2022(shared)X
-2264(memory)X
-2563(to)X
-2657(provide)X
-2934(a)X
-3002(least-recently-used)X
-3641(\(LRU\))X
-3886(block)X
-4095(cache.)X
-555 4921(Although)N
-886(the)X
-1013(current)X
-1270(library)X
-1513(provides)X
-1818(an)X
-1923(LRU)X
-2112(cache,)X
-2345(it)X
-2418(would)X
-2647(be)X
-2752(simple)X
-2994(to)X
-3085(add)X
-3229(alternate)X
-3534(replacement)X
-3955(policies)X
-4232(as)X
-555 5011(suggested)N
-903(by)X
-1015([CHOU85])X
-1408(or)X
-1507(to)X
-1601(provide)X
-1878(multiple)X
-2176(buffer)X
-2405(pools)X
-2610(with)X
-2784(different)X
-3092(policies.)X
-3412(Transactions)X
-3853(request)X
-4116(pages)X
-555 5101(from)N
-736(the)X
-859(buffer)X
-1081(manager)X
-1383(and)X
-1524(keep)X
-1701(them)X
-3 f
-1886(pinned)X
-1 f
-2145(to)X
-2232(ensure)X
-2466(that)X
-2610(they)X
-2772(are)X
-2895(not)X
-3021(written)X
-3272(to)X
-3358(disk)X
-3515(while)X
-3717(they)X
-3879(are)X
-4002(in)X
-4088(a)X
-4148(logi-)X
-555 5191(cally)N
-732(inconsistent)X
-1135(state.)X
-1343(When)X
-1556(page)X
-1729(replacement)X
-2143(is)X
-2217(necessary,)X
-2571(the)X
-3 f
-2689(Buffer)X
-2932(Manager)X
-1 f
-3264(\256nds)X
-3439(an)X
-3535(unpinned)X
-3853(page)X
-4025(and)X
-4161(then)X
-555 5281(checks)N
-794(with)X
-956(the)X
-3 f
-1074(Log)X
-1227(Manager)X
-1 f
-1559(to)X
-1641(ensure)X
-1871(that)X
-2011(the)X
-2129(write-ahead)X
-2529(protocol)X
-2816(is)X
-2889(enforced.)X
-3 f
-555 5467(3.2.3.)N
-775(The)X
-928(Lock)X
-1121(Manager)X
-1 f
-755 5590(The)N
-3 f
-901(Lock)X
-1095(Manager)X
-1 f
-1428(supports)X
-1720(general)X
-1978(purpose)X
-2253(locking)X
-2514(\(single)X
-2753(writer,)X
-2986(multiple)X
-3273(readers\))X
-3553(which)X
-3769(is)X
-3842(currently)X
-4152(used)X
-555 5680(to)N
-638(provide)X
-904(two-phase)X
-1254(locking)X
-1514(and)X
-1650(high)X
-1812(concurrency)X
-2230(B-tree)X
-2451(locking.)X
-2751(However,)X
-3086(the)X
-3204(general)X
-3461(purpose)X
-3735(nature)X
-3956(of)X
-4043(the)X
-4161(lock)X
-
-6 p
-%%Page: 6 6
-10 s 10 xH 0 xS 1 f
-3 f
-1 f
-555 630(manager)N
-857(provides)X
-1158(the)X
-1281(ability)X
-1510(to)X
-1597(support)X
-1862(a)X
-1923(variety)X
-2171(of)X
-2263(locking)X
-2528(protocols.)X
-2890(Currently,)X
-3241(all)X
-3345(locks)X
-3538(are)X
-3661(issued)X
-3885(at)X
-3967(the)X
-4089(granu-)X
-555 720(larity)N
-747(of)X
-837(a)X
-896(page)X
-1071(\(the)X
-1219(size)X
-1367(of)X
-1457(a)X
-1516(buffer)X
-1736(in)X
-1821(the)X
-1942(buffer)X
-2161(pool\))X
-2352(which)X
-2570(is)X
-2645(identi\256ed)X
-2969(by)X
-3071(two)X
-3213(4-byte)X
-3440(integers)X
-3716(\(a)X
-3801(\256le)X
-3925(id)X
-4009(and)X
-4147(page)X
-555 810(number\).)N
-898(This)X
-1071(provides)X
-1378(the)X
-1507(necessary)X
-1851(information)X
-2259(to)X
-2351(extend)X
-2595(the)X
-3 f
-2723(Lock)X
-2926(Manager)X
-1 f
-3268(to)X
-3360(perform)X
-3649(hierarchical)X
-4059(locking)X
-555 900([GRAY76].)N
-982(The)X
-1133(current)X
-1387(implementation)X
-1915(does)X
-2088(not)X
-2216(support)X
-2482(locks)X
-2677(at)X
-2760(other)X
-2950(granularities)X
-3376(and)X
-3517(does)X
-3689(not)X
-3816(promote)X
-4108(locks;)X
-555 990(these)N
-740(are)X
-859(obvious)X
-1132(future)X
-1344(additions)X
-1657(to)X
-1739(the)X
-1857(system.)X
-755 1113(If)N
-831(an)X
-929(incoming)X
-1253(lock)X
-1413(request)X
-1667(cannot)X
-1903(be)X
-2001(granted,)X
-2284(the)X
-2404(requesting)X
-2760(process)X
-3023(is)X
-3098(queued)X
-3352(for)X
-3467(the)X
-3586(lock)X
-3745(and)X
-3882(descheduled.)X
-555 1203(When)N
-769(a)X
-827(lock)X
-987(is)X
-1062(released,)X
-1368(the)X
-1488(wait)X
-1647(queue)X
-1860(is)X
-1934(traversed)X
-2250(and)X
-2387(any)X
-2524(newly)X
-2741(compatible)X
-3118(locks)X
-3308(are)X
-3428(granted.)X
-3730(Locks)X
-3947(are)X
-4067(located)X
-555 1293(via)N
-680(a)X
-743(\256le)X
-872(and)X
-1015(page)X
-1194(hash)X
-1368(table)X
-1551(and)X
-1694(are)X
-1820(chained)X
-2097(both)X
-2266(by)X
-2373(object)X
-2595(and)X
-2737(by)X
-2843(transaction,)X
-3241(facilitating)X
-3614(rapid)X
-3805(traversal)X
-4108(of)X
-4201(the)X
-555 1383(lock)N
-713(table)X
-889(during)X
-1118(transaction)X
-1490(commit)X
-1754(and)X
-1890(abort.)X
-755 1506(The)N
-907(primary)X
-1188(interfaces)X
-1528(to)X
-1617(the)X
-1742(lock)X
-1907(manager)X
-2211(are)X
-2 f
-2337(lock)X
-1 f
-2471(,)X
-2 f
-2518(unlock)X
-1 f
-2732(,)X
-2779(and)X
-2 f
-2922(lock_unlock_all)X
-1 f
-3434(.)X
-2 f
-3500(Lock)X
-1 f
-3682(obtains)X
-3939(a)X
-4001(new)X
-4161(lock)X
-555 1596(for)N
-680(a)X
-747(speci\256c)X
-1023(object.)X
-1290(There)X
-1509(are)X
-1638(also)X
-1797(two)X
-1947(variants)X
-2231(of)X
-2328(the)X
-2 f
-2456(lock)X
-1 f
-2620(request,)X
-2 f
-2902(lock_upgrade)X
-1 f
-3373(and)X
-2 f
-3519(lock_downgrade)X
-1 f
-4053(,)X
-4103(which)X
-555 1686(allow)N
-755(the)X
-875(caller)X
-1076(to)X
-1160(atomically)X
-1519(trade)X
-1701(a)X
-1758(lock)X
-1917(of)X
-2005(one)X
-2142(type)X
-2301(for)X
-2416(a)X
-2473(lock)X
-2632(of)X
-2720(another.)X
-2 f
-3022(Unlock)X
-1 f
-3275(releases)X
-3551(a)X
-3608(speci\256c)X
-3874(mode)X
-4073(of)X
-4161(lock)X
-555 1776(on)N
-655(a)X
-711(speci\256c)X
-976(object.)X
-2 f
-1232(Lock_unlock_all)X
-1 f
-1786(releases)X
-2061(all)X
-2161(the)X
-2279(locks)X
-2468(associated)X
-2818(with)X
-2980(a)X
-3036(speci\256c)X
-3301(transaction.)X
-3 f
-555 1962(3.2.4.)N
-775(The)X
-928(Process)X
-1207(Manager)X
-1 f
-755 2085(The)N
-3 f
-900(Process)X
-1179(Manager)X
-1 f
-1511(acts)X
-1656(as)X
-1743(a)X
-1799(user-level)X
-2136(scheduler)X
-2464(to)X
-2546(make)X
-2740(processes)X
-3068(wait)X
-3226(on)X
-3326(unavailable)X
-3716(locks)X
-3905(and)X
-4041(pending)X
-555 2175(buffer)N
-778(cache)X
-988(I/O.)X
-1161(For)X
-1297(each)X
-1470(process,)X
-1756(a)X
-1817(semaphore)X
-2190(is)X
-2268(maintained)X
-2649(upon)X
-2834(which)X
-3055(that)X
-3200(process)X
-3466(waits)X
-3660(when)X
-3859(it)X
-3928(needs)X
-4136(to)X
-4223(be)X
-555 2265(descheduled.)N
-1014(When)X
-1228(a)X
-1286(process)X
-1549(needs)X
-1754(to)X
-1838(be)X
-1936(run,)X
-2084(its)X
-2180(semaphore)X
-2549(is)X
-2623(cleared,)X
-2897(and)X
-3034(the)X
-3153(operating)X
-3477(system)X
-3720(reschedules)X
-4116(it.)X
-4201(No)X
-555 2355(sophisticated)N
-1002(scheduling)X
-1378(algorithm)X
-1718(is)X
-1799(applied;)X
-2085(if)X
-2162(the)X
-2288(lock)X
-2454(for)X
-2576(which)X
-2800(a)X
-2864(process)X
-3133(was)X
-3286(waiting)X
-3554(becomes)X
-3863(available,)X
-4201(the)X
-555 2445(process)N
-824(is)X
-905(made)X
-1107(runnable.)X
-1456(It)X
-1533(would)X
-1761(have)X
-1941(been)X
-2121(possible)X
-2411(to)X
-2501(change)X
-2757(the)X
-2883(kernel's)X
-3170(process)X
-3439(scheduler)X
-3775(to)X
-3865(interact)X
-4134(more)X
-555 2535(ef\256ciently)N
-900(with)X
-1062(the)X
-1180(lock)X
-1338(manager,)X
-1655(but)X
-1777(doing)X
-1979(so)X
-2070(would)X
-2290(have)X
-2462(compromised)X
-2918(our)X
-3045(commitment)X
-3469(to)X
-3551(a)X
-3607(user-level)X
-3944(package.)X
-3 f
-555 2721(3.2.5.)N
-775(The)X
-928(Transaction)X
-1361(Manager)X
-1 f
-755 2844(The)N
-3 f
-901(Transaction)X
-1335(Manager)X
-1 f
-1668(provides)X
-1965(the)X
-2084(standard)X
-2377(interface)X
-2680(of)X
-2 f
-2768(txn_begin)X
-1 f
-3084(,)X
-2 f
-3125(txn_commit)X
-1 f
-3499(,)X
-3540(and)X
-2 f
-3676(txn_abort)X
-1 f
-3987(.)X
-4047(It)X
-4116(keeps)X
-555 2934(track)N
-742(of)X
-835(all)X
-941(active)X
-1159(transactions,)X
-1588(assigns)X
-1845(unique)X
-2089(transaction)X
-2467(identi\256ers,)X
-2833(and)X
-2974(directs)X
-3213(the)X
-3336(abort)X
-3526(and)X
-3667(commit)X
-3936(processing.)X
-555 3024(When)N
-772(a)X
-2 f
-833(txn_begin)X
-1 f
-1174(is)X
-1252(issued,)X
-1497(the)X
-3 f
-1620(Transaction)X
-2058(Manager)X
-1 f
-2395(assigns)X
-2651(the)X
-2773(next)X
-2935(available)X
-3249(transaction)X
-3625(identi\256er,)X
-3958(allocates)X
-4263(a)X
-555 3114(per-process)N
-948(transaction)X
-1322(structure)X
-1625(in)X
-1709(shared)X
-1941(memory,)X
-2249(increments)X
-2622(the)X
-2741(count)X
-2940(of)X
-3028(active)X
-3241(transactions,)X
-3665(and)X
-3802(returns)X
-4046(the)X
-4165(new)X
-555 3204(transaction)N
-937(identi\256er)X
-1256(to)X
-1348(the)X
-1476(calling)X
-1724(process.)X
-2034(The)X
-2188(in-memory)X
-2573(transaction)X
-2954(structure)X
-3264(contains)X
-3560(a)X
-3625(pointer)X
-3881(into)X
-4034(the)X
-4161(lock)X
-555 3294(table)N
-734(for)X
-851(locks)X
-1043(held)X
-1204(by)X
-1307(this)X
-1445(transaction,)X
-1840(the)X
-1961(last)X
-2095(log)X
-2220(sequence)X
-2538(number,)X
-2826(a)X
-2885(transaction)X
-3260(state)X
-3430(\()X
-2 f
-3457(idle)X
-1 f
-(,)S
-2 f
-3620(running)X
-1 f
-3873(,)X
-2 f
-3915(aborting)X
-1 f
-4190(,)X
-4232(or)X
-2 f
-555 3384(committing\))N
-1 f
-942(,)X
-982(an)X
-1078(error)X
-1255(code,)X
-1447(and)X
-1583(a)X
-1639(semaphore)X
-2007(identi\256er.)X
-755 3507(At)N
-859(commit,)X
-1147(the)X
-3 f
-1269(Transaction)X
-1706(Manager)X
-1 f
-2042(calls)X
-2 f
-2213(log_commit)X
-1 f
-2615(to)X
-2700(record)X
-2929(the)X
-3050(end)X
-3189(of)X
-3279(transaction)X
-3654(and)X
-3793(to)X
-3878(\257ush)X
-4056(the)X
-4177(log.)X
-555 3597(Then)N
-743(it)X
-810(directs)X
-1047(the)X
-3 f
-1168(Lock)X
-1364(Manager)X
-1 f
-1699(to)X
-1784(release)X
-2031(all)X
-2134(locks)X
-2325(associated)X
-2677(with)X
-2841(the)X
-2961(given)X
-3161(transaction.)X
-3575(If)X
-3651(a)X
-3709(transaction)X
-4083(aborts,)X
-555 3687(the)N
-3 f
-680(Transaction)X
-1120(Manager)X
-1 f
-1459(calls)X
-1633(on)X
-2 f
-1739(log_unroll)X
-1 f
-2102(to)X
-2190(read)X
-2355(the)X
-2479(transaction's)X
-2915(log)X
-3043(records)X
-3306(and)X
-3448(undo)X
-3634(any)X
-3776(modi\256cations)X
-4237(to)X
-555 3777(the)N
-673(database.)X
-1010(As)X
-1119(in)X
-1201(the)X
-1319(commit)X
-1583(case,)X
-1762(it)X
-1826(then)X
-1984(calls)X
-2 f
-2151(lock_unlock_all)X
-1 f
-2683(to)X
-2765(release)X
-3009(the)X
-3127(transaction's)X
-3557(locks.)X
-3 f
-555 3963(3.2.6.)N
-775(The)X
-928(Record)X
-1198(Manager)X
-1 f
-755 4086(The)N
-3 f
-919(Record)X
-1208(Manager)X
-1 f
-1559(supports)X
-1869(the)X
-2006(abstraction)X
-2397(of)X
-2503(reading)X
-2783(and)X
-2938(writing)X
-3208(records)X
-3484(to)X
-3585(a)X
-3660(database.)X
-3996(We)X
-4147(have)X
-555 4176(modi\256ed)N
-861(the)X
-981(the)X
-1101(database)X
-1399(access)X
-1626(routines)X
-3 f
-1905(db)X
-1 f
-1993(\(3\))X
-2108([BSD91])X
-2418(to)X
-2501(call)X
-2638(the)X
-2757(log,)X
-2900(lock,)X
-3079(and)X
-3216(buffer)X
-3434(managers.)X
-3803(In)X
-3891(order)X
-4082(to)X
-4165(pro-)X
-555 4266(vide)N
-718(functionality)X
-1152(to)X
-1239(perform)X
-1523(undo)X
-1708(and)X
-1849(redo,)X
-2037(the)X
-3 f
-2160(Record)X
-2434(Manager)X
-1 f
-2770(de\256nes)X
-3021(a)X
-3081(collection)X
-3421(of)X
-3512(log)X
-3638(record)X
-3868(types)X
-4061(and)X
-4201(the)X
-555 4356(associated)N
-920(undo)X
-1115(and)X
-1266(redo)X
-1444(routines.)X
-1777(The)X
-3 f
-1937(Log)X
-2105(Manager)X
-1 f
-2452(performs)X
-2777(a)X
-2848(table)X
-3039(lookup)X
-3296(on)X
-3411(the)X
-3543(record)X
-3783(type)X
-3955(to)X
-4051(call)X
-4201(the)X
-555 4446(appropriate)N
-951(routines.)X
-1299(For)X
-1440(example,)X
-1762(the)X
-1890(B-tree)X
-2121(access)X
-2356(method)X
-2625(requires)X
-2913(two)X
-3062(log)X
-3193(record)X
-3428(types:)X
-3648(insert)X
-3855(and)X
-4000(delete.)X
-4241(A)X
-555 4536(replace)N
-808(operation)X
-1131(is)X
-1204(implemented)X
-1642(as)X
-1729(a)X
-1785(delete)X
-1997(followed)X
-2302(by)X
-2402(an)X
-2498(insert)X
-2696(and)X
-2832(is)X
-2905(logged)X
-3143(accordingly.)X
-3 f
-555 4722(3.3.)N
-715(Application)X
-1134(Architectures)X
-1 f
-755 4845(The)N
-907(structure)X
-1215(of)X
-1309(LIBTP)X
-1558(allows)X
-1794(application)X
-2177(designers)X
-2507(to)X
-2596(trade)X
-2784(off)X
-2905(performance)X
-3339(and)X
-3481(protection.)X
-3872(Since)X
-4076(a)X
-4138(large)X
-555 4935(portion)N
-810(of)X
-901(LIBTP's)X
-1205(functionality)X
-1638(is)X
-1715(provided)X
-2024(by)X
-2128(managing)X
-2468(structures)X
-2804(in)X
-2889(shared)X
-3122(memory,)X
-3432(its)X
-3530(structures)X
-3865(are)X
-3987(subject)X
-4237(to)X
-555 5025(corruption)N
-926(by)X
-1043(applications)X
-1467(when)X
-1678(the)X
-1813(library)X
-2064(is)X
-2154(linked)X
-2391(directly)X
-2673(with)X
-2852(the)X
-2987(application.)X
-3420(For)X
-3568(this)X
-3720(reason,)X
-3987(LIBTP)X
-4246(is)X
-555 5115(designed)N
-864(to)X
-950(allow)X
-1152(compilation)X
-1558(into)X
-1706(a)X
-1766(separate)X
-2053(server)X
-2273(process)X
-2537(which)X
-2756(may)X
-2917(be)X
-3016(accessed)X
-3321(via)X
-3442(a)X
-3501(socket)X
-3729(interface.)X
-4094(In)X
-4184(this)X
-555 5205(way)N
-712(LIBTP's)X
-1015(data)X
-1172(structures)X
-1507(are)X
-1629(protected)X
-1951(from)X
-2130(application)X
-2509(code,)X
-2704(but)X
-2829(communication)X
-3349(overhead)X
-3666(is)X
-3741(increased.)X
-4107(When)X
-555 5295(applications)N
-975(are)X
-1107(trusted,)X
-1377(LIBTP)X
-1631(may)X
-1801(be)X
-1909(compiled)X
-2239(directly)X
-2516(into)X
-2672(the)X
-2802(application)X
-3190(providing)X
-3533(improved)X
-3872(performance.)X
-555 5385(Figures)N
-815(two)X
-955(and)X
-1091(three)X
-1272(show)X
-1461(the)X
-1579(two)X
-1719(alternate)X
-2016(application)X
-2392(architectures.)X
-755 5508(There)N
-964(are)X
-1084(potentially)X
-1447(two)X
-1588(modes)X
-1818(in)X
-1901(which)X
-2118(one)X
-2255(might)X
-2462(use)X
-2590(LIBTP)X
-2833(in)X
-2916(a)X
-2972(server)X
-3189(based)X
-3392(architecture.)X
-3832(In)X
-3919(the)X
-4037(\256rst,)X
-4201(the)X
-555 5598(server)N
-778(would)X
-1004(provide)X
-1275(the)X
-1399(capability)X
-1741(to)X
-1829(respond)X
-2109(to)X
-2197(requests)X
-2486(to)X
-2574(each)X
-2747(of)X
-2839(the)X
-2962(low)X
-3107(level)X
-3288(modules)X
-3584(\(lock,)X
-3794(log,)X
-3941(buffer,)X
-4183(and)X
-555 5688(transaction)N
-944(managers\).)X
-1356(Unfortunately,)X
-1863(the)X
-1998(performance)X
-2442(of)X
-2546(such)X
-2730(a)X
-2803(system)X
-3062(is)X
-3152(likely)X
-3371(to)X
-3470(be)X
-3583(blindingly)X
-3947(slow)X
-4134(since)X
-
-7 p
-%%Page: 7 7
-10 s 10 xH 0 xS 1 f
-3 f
-1 f
-1 Dt
-1864 1125 MXY
-15 -26 Dl
--15 10 Dl
--14 -10 Dl
-14 26 Dl
-0 -266 Dl
-1315 1125 MXY
-15 -26 Dl
--15 10 Dl
--14 -10 Dl
-14 26 Dl
-0 -266 Dl
-3 Dt
-1133 1125 MXY
-0 798 Dl
-931 0 Dl
-0 -798 Dl
--931 0 Dl
-1 Dt
-1266 1257 MXY
-0 133 Dl
-665 0 Dl
-0 -133 Dl
--665 0 Dl
-3 f
-8 s
-1513 1351(driver)N
-1502 1617(LIBTP)N
-1266 1390 MXY
-0 400 Dl
-665 0 Dl
-0 -400 Dl
--665 0 Dl
-3 Dt
-1133 726 MXY
-0 133 Dl
-931 0 Dl
-0 -133 Dl
--931 0 Dl
-1 f
-1029 1098(txn_abort)N
-964 1015(txn_commit)N
-1018 932(txn_begin)N
-1910 1015(db_ops)N
-3 f
-1308 820(Application)N
-1645(Program)X
-1398 1218(Server)N
-1594(Process)X
-1 f
-1390 986(socket)N
-1569(interface)X
-1 Dt
-1848 967 MXY
--23 -14 Dl
-8 14 Dl
--8 15 Dl
-23 -15 Dl
--50 0 Dl
-1324 MX
-23 15 Dl
--9 -15 Dl
-9 -14 Dl
--23 14 Dl
-50 0 Dl
-3 Dt
-2862 859 MXY
-0 1064 Dl
-932 0 Dl
-0 -1064 Dl
--932 0 Dl
-1 Dt
-3178 1390 MXY
-24 -12 Dl
--17 0 Dl
--8 -15 Dl
-1 27 Dl
-150 -265 Dl
-3494 1390 MXY
-0 -27 Dl
--8 15 Dl
--16 1 Dl
-24 11 Dl
--166 -265 Dl
-3 f
-3232 1617(LIBTP)N
-2995 1390 MXY
-0 400 Dl
-666 0 Dl
-0 -400 Dl
--666 0 Dl
-992 MY
-0 133 Dl
-666 0 Dl
-0 -133 Dl
--666 0 Dl
-3168 1086(Application)N
-1 f
-2939 1201(txn_begin)N
-2885 1284(txn_commit)N
-2950 1368(txn_abort)N
-3465 1284(db_ops)N
-3 f
-3155 766(Single)N
-3339(Process)X
-3 Dt
--1 Ds
-811 2100(Figure)N
-1023(2:)X
-1107(Server)X
-1318(Architecture.)X
-1 f
-1727(In)X
-1811(this)X
-1934(con\256guration,)X
-811 2190(the)N
-916(library)X
-1113(is)X
-1183(loaded)X
-1380(into)X
-1507(a)X
-1562(server)X
-1744(process)X
-1962(which)X
-2145(is)X
-2214(ac-)X
-811 2280(cessed)N
-993(via)X
-1087(a)X
-1131(socket)X
-1310(interface.)X
-3 f
-2563 2100(Figure)N
-2803(3:)X
-2914(Single)X
-3140(Process)X
-3403(Architecture.)X
-1 f
-3839(In)X
-3950(this)X
-2563 2190(con\256guration,)N
-2948(the)X
-3053(library)X
-3250(routines)X
-3483(are)X
-3587(loaded)X
-3784(as)X
-3864(part)X
-3990(of)X
-2563 2280(the)N
-2657(application)X
-2957(and)X
-3065(accessed)X
-3303(via)X
-3397(a)X
-3441(subroutine)X
-3727(interface.)X
-10 s
-10 f
-555 2403(h)N
-579(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)X
-1 f
-555 2679(modifying)N
-909(a)X
-966(piece)X
-1157(of)X
-1245(data)X
-1400(would)X
-1621(require)X
-1870(three)X
-2051(or)X
-2138(possibly)X
-2424(four)X
-2578(separate)X
-2862(communications:)X
-3433(one)X
-3569(to)X
-3651(lock)X
-3809(the)X
-3927(data,)X
-4101(one)X
-4237(to)X
-555 2769(obtain)N
-781(the)X
-905(data,)X
-1085(one)X
-1227(to)X
-1315(log)X
-1443(the)X
-1567(modi\256cation,)X
-2017(and)X
-2159(possibly)X
-2451(one)X
-2593(to)X
-2681(transmit)X
-2969(the)X
-3093(modi\256ed)X
-3403(data.)X
-3583(Figure)X
-3817(four)X
-3976(shows)X
-4201(the)X
-555 2859(relative)N
-826(performance)X
-1263(for)X
-1387(retrieving)X
-1728(a)X
-1793(single)X
-2013(record)X
-2248(using)X
-2450(the)X
-2577(record)X
-2812(level)X
-2997(call)X
-3142(versus)X
-3376(using)X
-3578(the)X
-3705(lower)X
-3917(level)X
-4102(buffer)X
-555 2949(management)N
-987(and)X
-1125(locking)X
-1387(calls.)X
-1616(The)X
-1763(2:1)X
-1887(ratio)X
-2056(observed)X
-2367(in)X
-2450(the)X
-2569(single)X
-2781(process)X
-3043(case)X
-3203(re\257ects)X
-3456(the)X
-3575(additional)X
-3916(overhead)X
-4232(of)X
-555 3039(parsing)N
-819(eight)X
-1006(commands)X
-1380(rather)X
-1595(than)X
-1760(one)X
-1903(while)X
-2108(the)X
-2233(3:1)X
-2362(ratio)X
-2536(observed)X
-2853(in)X
-2942(the)X
-3067(client/server)X
-3491(architecture)X
-3898(re\257ects)X
-4157(both)X
-555 3129(the)N
-679(parsing)X
-941(and)X
-1083(the)X
-1207(communication)X
-1731(overheard.)X
-2118(Although)X
-2445(there)X
-2631(may)X
-2794(be)X
-2895(applications)X
-3307(which)X
-3528(could)X
-3731(tolerate)X
-3997(such)X
-4169(per-)X
-555 3219(formance,)N
-904(it)X
-973(seems)X
-1194(far)X
-1309(more)X
-1499(feasible)X
-1774(to)X
-1861(support)X
-2126(a)X
-2187(higher)X
-2417(level)X
-2597(interface,)X
-2923(such)X
-3094(as)X
-3185(that)X
-3329(provided)X
-3638(by)X
-3742(a)X
-3802(query)X
-4009(language)X
-555 3309(\()N
-2 f
-582(e.g.)X
-1 f
-718(SQL)X
-889([SQL86]\).)X
-755 3432(Although)N
-1081(LIBTP)X
-1327(does)X
-1498(not)X
-1624(have)X
-1800(an)X
-1900(SQL)X
-2075(parser,)X
-2316(we)X
-2433(have)X
-2608(built)X
-2777(a)X
-2836(server)X
-3056(application)X
-3435(using)X
-3631(the)X
-3752(toolkit)X
-3983(command)X
-555 3522(language)N
-882(\(TCL\))X
-1124([OUST90].)X
-1544(The)X
-1706(server)X
-1940(supports)X
-2248(a)X
-2321(command)X
-2674(line)X
-2831(interface)X
-3150(similar)X
-3409(to)X
-3508(the)X
-3643(subroutine)X
-4017(interface)X
-555 3612(de\256ned)N
-811(in)X
-3 f
-893(db)X
-1 f
-981(\(3\).)X
-1135(Since)X
-1333(it)X
-1397(is)X
-1470(based)X
-1673(on)X
-1773(TCL,)X
-1964(it)X
-2028(provides)X
-2324(control)X
-2571(structures)X
-2903(as)X
-2990(well.)X
-3 f
-555 3798(4.)N
-655(Implementation)X
-1 f
-3 f
-555 3984(4.1.)N
-715(Locking)X
-1014(and)X
-1162(Deadlock)X
-1502(Detection)X
-1 f
-755 4107(LIBTP)N
-1007(uses)X
-1175(two-phase)X
-1535(locking)X
-1805(for)X
-1929(user)X
-2093(data.)X
-2297(Strictly)X
-2562(speaking,)X
-2897(the)X
-3024(two)X
-3173(phases)X
-3416(in)X
-3507(two-phase)X
-3866(locking)X
-4135(are)X
-4263(a)X
-3 f
-555 4197(grow)N
-1 f
-756(phase,)X
-986(during)X
-1221(which)X
-1443(locks)X
-1638(are)X
-1763(acquired,)X
-2086(and)X
-2228(a)X
-3 f
-2290(shrink)X
-1 f
-2537(phase,)X
-2766(during)X
-3001(which)X
-3223(locks)X
-3418(are)X
-3543(released.)X
-3873(No)X
-3997(lock)X
-4161(may)X
-555 4287(ever)N
-720(be)X
-822(acquired)X
-1124(during)X
-1358(the)X
-1481(shrink)X
-1706(phase.)X
-1954(The)X
-2104(grow)X
-2294(phase)X
-2502(lasts)X
-2669(until)X
-2840(the)X
-2963(\256rst)X
-3112(release,)X
-3381(which)X
-3602(marks)X
-3823(the)X
-3946(start)X
-4109(of)X
-4201(the)X
-555 4377(shrink)N
-780(phase.)X
-1028(In)X
-1120(practice,)X
-1420(the)X
-1543(grow)X
-1733(phase)X
-1941(lasts)X
-2108(for)X
-2227(the)X
-2350(duration)X
-2642(of)X
-2734(a)X
-2795(transaction)X
-3172(in)X
-3259(LIBTP)X
-3506(and)X
-3647(in)X
-3734(commercial)X
-4138(data-)X
-555 4467(base)N
-721(systems.)X
-1037(The)X
-1184(shrink)X
-1406(phase)X
-1611(takes)X
-1798(place)X
-1990(during)X
-2221(transaction)X
-2595(commit)X
-2861(or)X
-2950(abort.)X
-3177(This)X
-3341(means)X
-3568(that)X
-3710(locks)X
-3901(are)X
-4022(acquired)X
-555 4557(on)N
-655(demand)X
-929(during)X
-1158(the)X
-1276(lifetime)X
-1545(of)X
-1632(a)X
-1688(transaction,)X
-2080(and)X
-2216(held)X
-2374(until)X
-2540(commit)X
-2804(time,)X
-2986(at)X
-3064(which)X
-3280(point)X
-3464(all)X
-3564(locks)X
-3753(are)X
-3872(released.)X
-755 4680(If)N
-832(multiple)X
-1121(transactions)X
-1527(are)X
-1649(active)X
-1864(concurrently,)X
-2313(deadlocks)X
-2657(can)X
-2792(occur)X
-2994(and)X
-3133(must)X
-3311(be)X
-3410(detected)X
-3701(and)X
-3840(resolved.)X
-4174(The)X
-555 4770(lock)N
-715(table)X
-893(can)X
-1027(be)X
-1125(thought)X
-1391(of)X
-1480(as)X
-1569(a)X
-1627(representation)X
-2104(of)X
-2193(a)X
-2251(directed)X
-2532(graph.)X
-2777(The)X
-2924(nodes)X
-3133(in)X
-3216(the)X
-3335(graph)X
-3539(are)X
-3659(transactions.)X
-4103(Edges)X
-555 4860(represent)N
-878(the)X
-3 f
-1004(waits-for)X
-1 f
-1340(relation)X
-1613(between)X
-1909(transactions;)X
-2342(if)X
-2419(transaction)X
-2 f
-2799(A)X
-1 f
-2876(is)X
-2957(waiting)X
-3225(for)X
-3347(a)X
-3411(lock)X
-3577(held)X
-3743(by)X
-3851(transaction)X
-2 f
-4230(B)X
-1 f
-4279(,)X
-555 4950(then)N
-716(a)X
-775(directed)X
-1057(edge)X
-1232(exists)X
-1437(from)X
-2 f
-1616(A)X
-1 f
-1687(to)X
-2 f
-1771(B)X
-1 f
-1842(in)X
-1926(the)X
-2046(graph.)X
-2291(A)X
-2371(deadlock)X
-2683(exists)X
-2887(if)X
-2958(a)X
-3016(cycle)X
-3208(appears)X
-3476(in)X
-3560(the)X
-3680(graph.)X
-3925(By)X
-4040(conven-)X
-555 5040(tion,)N
-719(no)X
-819(transaction)X
-1191(ever)X
-1350(waits)X
-1539(for)X
-1653(a)X
-1709(lock)X
-1867(it)X
-1931(already)X
-2188(holds,)X
-2401(so)X
-2492(re\257exive)X
-2793(edges)X
-2996(are)X
-3115(impossible.)X
-755 5163(A)N
-836(distinguished)X
-1285(process)X
-1549(monitors)X
-1856(the)X
-1977(lock)X
-2138(table,)X
-2337(searching)X
-2668(for)X
-2785(cycles.)X
-3048(The)X
-3195(frequency)X
-3539(with)X
-3703(which)X
-3921(this)X
-4058(process)X
-555 5253(runs)N
-716(is)X
-792(user-settable;)X
-1243(for)X
-1360(the)X
-1481(multi-user)X
-1833(tests)X
-1998(discussed)X
-2328(in)X
-2413(section)X
-2663(5.1.2,)X
-2866(it)X
-2933(has)X
-3063(been)X
-3238(set)X
-3350(to)X
-3435(wake)X
-3628(up)X
-3731(every)X
-3932(second,)X
-4197(but)X
-555 5343(more)N
-742(sophisticated)X
-1182(schedules)X
-1516(are)X
-1636(certainly)X
-1938(possible.)X
-2261(When)X
-2474(a)X
-2531(cycle)X
-2722(is)X
-2796(detected,)X
-3105(one)X
-3242(of)X
-3330(the)X
-3449(transactions)X
-3853(in)X
-3936(the)X
-4055(cycle)X
-4246(is)X
-555 5433(nominated)N
-917(and)X
-1057(aborted.)X
-1362(When)X
-1578(the)X
-1700(transaction)X
-2076(aborts,)X
-2315(it)X
-2382(rolls)X
-2547(back)X
-2722(its)X
-2820(changes)X
-3102(and)X
-3241(releases)X
-3519(its)X
-3617(locks,)X
-3829(thereby)X
-4093(break-)X
-555 5523(ing)N
-677(the)X
-795(cycle)X
-985(in)X
-1067(the)X
-1185(graph.)X
-
-8 p
-%%Page: 8 8
-10 s 10 xH 0 xS 1 f
-3 f
-1 f
-4 Ds
-1 Dt
-1866 865 MXY
-1338 0 Dl
-1866 1031 MXY
-1338 0 Dl
-1866 1199 MXY
-1338 0 Dl
-1866 1366 MXY
-1338 0 Dl
-1866 1533 MXY
-1338 0 Dl
-1866 1701 MXY
-1338 0 Dl
--1 Ds
-5 Dt
-1866 1868 MXY
-1338 0 Dl
-1 Dt
-1 Di
-2981 MX
- 2981 1868 lineto
- 2981 1575 lineto
- 3092 1575 lineto
- 3092 1868 lineto
- 2981 1868 lineto
-closepath 21 2981 1575 3092 1868 Dp
-2646 MX
- 2646 1868 lineto
- 2646 949 lineto
- 2758 949 lineto
- 2758 1868 lineto
- 2646 1868 lineto
-closepath 14 2646 949 2758 1868 Dp
-2312 MX
- 2312 1868 lineto
- 2312 1701 lineto
- 2423 1701 lineto
- 2423 1868 lineto
- 2312 1868 lineto
-closepath 3 2312 1701 2423 1868 Dp
-1977 MX
- 1977 1868 lineto
- 1977 1512 lineto
- 2089 1512 lineto
- 2089 1868 lineto
- 1977 1868 lineto
-closepath 19 1977 1512 2089 1868 Dp
-3 f
-2640 2047(Client/Server)N
-1957(Single)X
-2185(Process)X
-7 s
-2957 1957(record)N
-2570(component)X
-2289(record)X
-1890(components)X
-1733 1724(.1)N
-1733 1556(.2)N
-1733 1389(.3)N
-1733 1222(.4)N
-1733 1055(.5)N
-1733 889(.6)N
-1590 726(Elapsed)N
-1794(Time)X
-1613 782(\(in)N
-1693(seconds\))X
-3 Dt
--1 Ds
-8 s
-555 2255(Figure)N
-756(4:)X
-829(Comparison)X
-1187(of)X
-1260(High)X
-1416(and)X
-1540(Low)X
-1681(Level)X
-1850(Interfaces.)X
-1 f
-2174(Elapsed)X
-2395(time)X
-2528(in)X
-2597(seconds)X
-2818(to)X
-2887(perform)X
-3111(a)X
-3158(single)X
-3330(record)X
-3511(retrieval)X
-3742(from)X
-3885(a)X
-3932(command)X
-4203(line)X
-555 2345(\(rather)N
-751(than)X
-888(a)X
-943(procedural)X
-1241(interface\))X
-1510(is)X
-1579(shown)X
-1772(on)X
-1862(the)X
-1966(y)X
-2024(axis.)X
-2185(The)X
-2310(``component'')X
-2704(numbers)X
-2950(re\257ect)X
-3135(the)X
-3239(timings)X
-3458(when)X
-3622(the)X
-3726(record)X
-3914(is)X
-3983(retrieved)X
-4235(by)X
-555 2435(separate)N
-785(calls)X
-924(to)X
-996(the)X
-1096(lock)X
-1228(manager)X
-1469(and)X
-1583(buffer)X
-1760(manager)X
-2001(while)X
-2165(the)X
-2264(``record'')X
-2531(timings)X
-2745(were)X
-2889(obtained)X
-3130(by)X
-3215(using)X
-3375(a)X
-3424(single)X
-3598(call)X
-3711(to)X
-3782(the)X
-3881(record)X
-4064(manager.)X
-555 2525(The)N
-674(2:1)X
-776(ratio)X
-913(observed)X
-1163(for)X
-1257(the)X
-1355(single)X
-1528(process)X
-1739(case)X
-1868(is)X
-1930(a)X
-1977(re\257ection)X
-2237(of)X
-2309(the)X
-2406(parsing)X
-2613(overhead)X
-2865(for)X
-2958(executing)X
-3225(eight)X
-3372(separate)X
-3599(commands)X
-3895(rather)X
-4062(than)X
-4191(one.)X
-555 2615(The)N
-673(additional)X
-948(factor)X
-1115(of)X
-1187(one)X
-1298(re\257ected)X
-1536(in)X
-1605(the)X
-1702(3:1)X
-1803(ratio)X
-1939(for)X
-2031(the)X
-2127(client/server)X
-2460(architecture)X
-2794(is)X
-2855(due)X
-2965(to)X
-3033(the)X
-3129(communication)X
-3545(overhead.)X
-3828(The)X
-3945(true)X
-4062(ratios)X
-4222(are)X
-555 2705(actually)N
-775(worse)X
-945(since)X
-1094(the)X
-1190(component)X
-1492(timings)X
-1703(do)X
-1785(not)X
-1884(re\257ect)X
-2060(the)X
-2155(search)X
-2334(times)X
-2490(within)X
-2671(each)X
-2804(page)X
-2941(or)X
-3011(the)X
-3106(time)X
-3237(required)X
-3466(to)X
-3533(transmit)X
-3760(the)X
-3855(page)X
-3992(between)X
-4221(the)X
-555 2795(two)N
-667(processes.)X
-10 s
-10 f
-555 2885(h)N
-579(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)X
-3 f
-555 3161(4.2.)N
-715(Group)X
-961(Commit)X
-1 f
-755 3284(Since)N
-959(the)X
-1083(log)X
-1211(must)X
-1392(be)X
-1494(\257ushed)X
-1751(to)X
-1839(disk)X
-1997(at)X
-2080(commit)X
-2349(time,)X
-2536(disk)X
-2694(bandwidth)X
-3057(fundamentally)X
-3545(limits)X
-3751(the)X
-3874(rate)X
-4020(at)X
-4103(which)X
-555 3374(transactions)N
-959(complete.)X
-1314(Since)X
-1513(most)X
-1688(transactions)X
-2091(write)X
-2276(only)X
-2438(a)X
-2494(few)X
-2635(small)X
-2828(records)X
-3085(to)X
-3167(the)X
-3285(log,)X
-3427(the)X
-3545(last)X
-3676(page)X
-3848(of)X
-3935(the)X
-4053(log)X
-4175(will)X
-555 3464(be)N
-658(\257ushed)X
-916(once)X
-1095(by)X
-1202(every)X
-1408(transaction)X
-1787(which)X
-2010(writes)X
-2233(to)X
-2322(it.)X
-2433(In)X
-2527(the)X
-2652(naive)X
-2853(implementation,)X
-3402(these)X
-3593(\257ushes)X
-3841(would)X
-4067(happen)X
-555 3554(serially.)N
-755 3677(LIBTP)N
-1008(uses)X
-3 f
-1177(group)X
-1412(commit)X
-1 f
-1702([DEWI84])X
-2077(in)X
-2170(order)X
-2371(to)X
-2464(amortize)X
-2775(the)X
-2903(cost)X
-3062(of)X
-3159(one)X
-3305(synchronous)X
-3740(disk)X
-3903(write)X
-4098(across)X
-555 3767(multiple)N
-851(transactions.)X
-1304(Group)X
-1539(commit)X
-1812(provides)X
-2117(a)X
-2182(way)X
-2345(for)X
-2468(a)X
-2533(group)X
-2749(of)X
-2845(transactions)X
-3257(to)X
-3348(commit)X
-3621(simultaneously.)X
-4174(The)X
-555 3857(\256rst)N
-709(several)X
-967(transactions)X
-1380(to)X
-1472(commit)X
-1745(write)X
-1939(their)X
-2115(changes)X
-2403(to)X
-2494(the)X
-2621(in-memory)X
-3006(log)X
-3137(page,)X
-3338(then)X
-3505(sleep)X
-3699(on)X
-3808(a)X
-3873(distinguished)X
-555 3947(semaphore.)N
-966(Later,)X
-1179(a)X
-1238(committing)X
-1629(transaction)X
-2004(\257ushes)X
-2249(the)X
-2370(page)X
-2545(to)X
-2630(disk,)X
-2805(and)X
-2943(wakes)X
-3166(up)X
-3268(all)X
-3370(its)X
-3467(sleeping)X
-3756(peers.)X
-3988(The)X
-4135(point)X
-555 4037(at)N
-635(which)X
-853(changes)X
-1134(are)X
-1255(actually)X
-1531(written)X
-1780(is)X
-1855(determined)X
-2238(by)X
-2340(three)X
-2523(thresholds.)X
-2914(The)X
-3061(\256rst)X
-3207(is)X
-3281(the)X
-2 f
-3400(group)X
-3612(threshold)X
-1 f
-3935(and)X
-4072(de\256nes)X
-555 4127(the)N
-674(minimum)X
-1005(number)X
-1271(of)X
-1359(transactions)X
-1763(which)X
-1979(must)X
-2154(be)X
-2250(active)X
-2462(in)X
-2544(the)X
-2662(system)X
-2904(before)X
-3130(transactions)X
-3533(are)X
-3652(forced)X
-3878(to)X
-3960(participate)X
-555 4217(in)N
-646(a)X
-711(group)X
-927(commit.)X
-1240(The)X
-1394(second)X
-1646(is)X
-1728(the)X
-2 f
-1855(wait)X
-2021(threshold)X
-1 f
-2352(which)X
-2577(is)X
-2658(expressed)X
-3003(as)X
-3098(the)X
-3224(percentage)X
-3601(of)X
-3696(active)X
-3916(transactions)X
-555 4307(waiting)N
-826(to)X
-919(be)X
-1026(committed.)X
-1439(The)X
-1595(last)X
-1737(is)X
-1821(the)X
-2 f
-1950(logdelay)X
-2257(threshold)X
-1 f
-2590(which)X
-2816(indicates)X
-3131(how)X
-3299(much)X
-3507(un\257ushed)X
-3848(log)X
-3980(should)X
-4223(be)X
-555 4397(allowed)N
-829(to)X
-911(accumulate)X
-1297(before)X
-1523(a)X
-1579(waiting)X
-1839(transaction's)X
-2289(commit)X
-2553(record)X
-2779(is)X
-2852(\257ushed.)X
-755 4520(Group)N
-981(commit)X
-1246(can)X
-1379(substantially)X
-1803(improve)X
-2090(performance)X
-2517(for)X
-2631(high-concurrency)X
-3218(environments.)X
-3714(If)X
-3788(only)X
-3950(a)X
-4006(few)X
-4147(tran-)X
-555 4610(sactions)N
-836(are)X
-957(running,)X
-1248(it)X
-1314(is)X
-1389(unlikely)X
-1673(to)X
-1757(improve)X
-2046(things)X
-2263(at)X
-2343(all.)X
-2485(The)X
-2632(crossover)X
-2962(point)X
-3148(is)X
-3223(the)X
-3343(point)X
-3529(at)X
-3609(which)X
-3827(the)X
-3947(transaction)X
-555 4700(commit)N
-823(rate)X
-968(is)X
-1045(limited)X
-1295(by)X
-1399(the)X
-1521(bandwidth)X
-1883(of)X
-1974(the)X
-2096(device)X
-2330(on)X
-2434(which)X
-2654(the)X
-2776(log)X
-2902(resides.)X
-3189(If)X
-3267(processes)X
-3599(are)X
-3722(trying)X
-3937(to)X
-4023(\257ush)X
-4201(the)X
-555 4790(log)N
-677(faster)X
-876(than)X
-1034(the)X
-1152(log)X
-1274(disk)X
-1427(can)X
-1559(accept)X
-1785(data,)X
-1959(then)X
-2117(group)X
-2324(commit)X
-2588(will)X
-2732(increase)X
-3016(the)X
-3134(commit)X
-3398(rate.)X
-3 f
-555 4976(4.3.)N
-715(Kernel)X
-971(Intervention)X
-1418(for)X
-1541(Synchronization)X
-1 f
-755 5099(Since)N
-954(LIBTP)X
-1197(uses)X
-1356(data)X
-1511(in)X
-1594(shared)X
-1825(memory)X
-2113(\()X
-2 f
-2140(e.g.)X
-1 f
-2277(the)X
-2395(lock)X
-2553(table)X
-2729(and)X
-2865(buffer)X
-3082(pool\))X
-3271(it)X
-3335(must)X
-3510(be)X
-3606(possible)X
-3888(for)X
-4002(a)X
-4058(process)X
-555 5189(to)N
-640(acquire)X
-900(exclusive)X
-1226(access)X
-1454(to)X
-1538(shared)X
-1770(data)X
-1926(in)X
-2010(order)X
-2202(to)X
-2286(prevent)X
-2549(corruption.)X
-2945(In)X
-3034(addition,)X
-3338(the)X
-3458(process)X
-3721(manager)X
-4020(must)X
-4197(put)X
-555 5279(processes)N
-886(to)X
-971(sleep)X
-1159(when)X
-1356(the)X
-1477(lock)X
-1638(or)X
-1728(buffer)X
-1948(they)X
-2109(request)X
-2364(is)X
-2440(in)X
-2525(use)X
-2655(by)X
-2758(some)X
-2950(other)X
-3138(process.)X
-3441(In)X
-3530(the)X
-3650(LIBTP)X
-3894(implementa-)X
-555 5385(tion)N
-705(under)X
-914(Ultrix)X
-1131(4.0)X
-7 s
-5353(2)Y
-10 s
-5385(,)Y
-1305(we)X
-1424(use)X
-1556(System)X
-1816(V)X
-1899(semaphores)X
-2303(to)X
-2390(provide)X
-2660(this)X
-2800(synchronization.)X
-3377(Semaphores)X
-3794(implemented)X
-4237(in)X
-555 5475(this)N
-701(fashion)X
-968(turn)X
-1128(out)X
-1261(to)X
-1354(be)X
-1461(an)X
-1568(expensive)X
-1920(choice)X
-2161(for)X
-2285(synchronization,)X
-2847(because)X
-3132(each)X
-3310(access)X
-3546(traps)X
-3732(to)X
-3824(the)X
-3952(kernel)X
-4183(and)X
-8 s
-10 f
-555 5547(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)N
-5 s
-1 f
-727 5625(2)N
-8 s
-763 5650(Ultrix)N
-932(and)X
-1040(DEC)X
-1184(are)X
-1277(trademarks)X
-1576(of)X
-1645(Digital)X
-1839(Equipment)X
-2136(Corporation.)X
-
-9 p
-%%Page: 9 9
-8 s 8 xH 0 xS 1 f
-10 s
-3 f
-1 f
-555 630(executes)N
-852(atomically)X
-1210(there.)X
-755 753(On)N
-878(architectures)X
-1314(that)X
-1459(support)X
-1724(atomic)X
-1967(test-and-set,)X
-2382(a)X
-2443(much)X
-2646(better)X
-2854(choice)X
-3089(would)X
-3314(be)X
-3415(to)X
-3502(attempt)X
-3767(to)X
-3854(obtain)X
-4079(a)X
-4139(spin-)X
-555 843(lock)N
-714(with)X
-877(a)X
-934(test-and-set,)X
-1345(and)X
-1482(issue)X
-1663(a)X
-1720(system)X
-1963(call)X
-2100(only)X
-2263(if)X
-2333(the)X
-2452(spinlock)X
-2744(is)X
-2818(unavailable.)X
-3249(Since)X
-3447(virtually)X
-3738(all)X
-3838(semaphores)X
-4237(in)X
-555 933(LIBTP)N
-801(are)X
-924(uncontested)X
-1330(and)X
-1469(are)X
-1591(held)X
-1752(for)X
-1869(very)X
-2035(short)X
-2218(periods)X
-2477(of)X
-2567(time,)X
-2752(this)X
-2890(would)X
-3113(improve)X
-3403(performance.)X
-3873(For)X
-4007(example,)X
-555 1023(processes)N
-885(must)X
-1062(acquire)X
-1321(exclusive)X
-1646(access)X
-1874(to)X
-1958(buffer)X
-2177(pool)X
-2341(metadata)X
-2653(in)X
-2737(order)X
-2929(to)X
-3013(\256nd)X
-3159(and)X
-3297(pin)X
-3421(a)X
-3479(buffer)X
-3698(in)X
-3781(shared)X
-4012(memory.)X
-555 1113(This)N
-721(semaphore)X
-1093(is)X
-1170(requested)X
-1502(most)X
-1681(frequently)X
-2034(in)X
-2119(LIBTP.)X
-2404(However,)X
-2742(once)X
-2917(it)X
-2984(is)X
-3060(acquired,)X
-3380(only)X
-3545(a)X
-3604(few)X
-3748(instructions)X
-4144(must)X
-555 1203(be)N
-656(executed)X
-966(before)X
-1196(it)X
-1264(is)X
-1341(released.)X
-1669(On)X
-1791(one)X
-1931(architecture)X
-2335(for)X
-2453(which)X
-2673(we)X
-2791(were)X
-2972(able)X
-3130(to)X
-3216(gather)X
-3441(detailed)X
-3719(pro\256ling)X
-4018(informa-)X
-555 1293(tion,)N
-729(the)X
-857(cost)X
-1015(of)X
-1111(the)X
-1238(semaphore)X
-1615(calls)X
-1791(accounted)X
-2146(for)X
-2269(25%)X
-2445(of)X
-2541(the)X
-2668(total)X
-2839(time)X
-3010(spent)X
-3208(updating)X
-3517(the)X
-3644(metadata.)X
-4003(This)X
-4174(was)X
-555 1383(fairly)N
-749(consistent)X
-1089(across)X
-1310(most)X
-1485(of)X
-1572(the)X
-1690(critical)X
-1933(sections.)X
-755 1506(In)N
-848(an)X
-950(attempt)X
-1216(to)X
-1304(quantify)X
-1597(the)X
-1720(overhead)X
-2040(of)X
-2132(kernel)X
-2358(synchronization,)X
-2915(we)X
-3034(ran)X
-3162(tests)X
-3329(on)X
-3434(a)X
-3495(version)X
-3756(of)X
-3848(4.3BSD-Reno)X
-555 1596(which)N
-786(had)X
-937(been)X
-1123(modi\256ed)X
-1441(to)X
-1537(support)X
-1811(binary)X
-2050(semaphore)X
-2432(facilities)X
-2742(similar)X
-2998(to)X
-3094(those)X
-3297(described)X
-3639(in)X
-3735([POSIX91].)X
-4174(The)X
-555 1686(hardware)N
-880(platform)X
-1181(consisted)X
-1504(of)X
-1595(an)X
-1695(HP300)X
-1941(\(33MHz)X
-2237(MC68030\))X
-2612(workstation)X
-3014(with)X
-3180(16MBytes)X
-3537(of)X
-3628(main)X
-3812(memory,)X
-4123(and)X
-4263(a)X
-555 1776(600MByte)N
-920(HP7959)X
-1205(SCSI)X
-1396(disk)X
-1552(\(17)X
-1682(ms)X
-1798(average)X
-2072(seek)X
-2237(time\).)X
-2468(We)X
-2602(ran)X
-2727(three)X
-2910(sets)X
-3052(of)X
-3141(comparisons)X
-3568(which)X
-3786(are)X
-3907(summarized)X
-555 1866(in)N
-645(\256gure)X
-860(\256ve.)X
-1028(In)X
-1123(each)X
-1299(comparison)X
-1701(we)X
-1823(ran)X
-1954(two)X
-2102(tests,)X
-2292(one)X
-2436(using)X
-2637(hardware)X
-2965(spinlocks)X
-3295(and)X
-3438(the)X
-3563(other)X
-3755(using)X
-3955(kernel)X
-4183(call)X
-555 1956(synchronization.)N
-1135(Since)X
-1341(the)X
-1467(test)X
-1606(was)X
-1758(run)X
-1892(single-user,)X
-2291(none)X
-2474(of)X
-2568(the)X
-2693(the)X
-2818(locks)X
-3014(were)X
-3198(contested.)X
-3568(In)X
-3662(the)X
-3787(\256rst)X
-3938(two)X
-4085(sets)X
-4232(of)X
-555 2046(tests,)N
-743(we)X
-863(ran)X
-992(the)X
-1116(full)X
-1253(transaction)X
-1631(processing)X
-2000(benchmark)X
-2383(described)X
-2717(in)X
-2805(section)X
-3058(5.1.)X
-3223(In)X
-3315(one)X
-3456(case)X
-3620(we)X
-3739(ran)X
-3867(with)X
-4034(both)X
-4201(the)X
-555 2136(database)N
-854(and)X
-992(log)X
-1116(on)X
-1218(the)X
-1338(same)X
-1525(disk)X
-1680(\(1)X
-1769(Disk\))X
-1969(and)X
-2107(in)X
-2191(the)X
-2311(second,)X
-2576(we)X
-2692(ran)X
-2817(with)X
-2981(the)X
-3101(database)X
-3400(and)X
-3538(log)X
-3661(on)X
-3762(separate)X
-4047(disks)X
-4232(\(2)X
-555 2226(Disk\).)N
-800(In)X
-894(the)X
-1019(last)X
-1157(test,)X
-1315(we)X
-1436(wanted)X
-1695(to)X
-1784(create)X
-2004(a)X
-2067(CPU)X
-2249(bound)X
-2476(environment,)X
-2928(so)X
-3026(we)X
-3146(used)X
-3319(a)X
-3381(database)X
-3684(small)X
-3883(enough)X
-4145(to)X
-4233(\256t)X
-555 2316(completely)N
-941(in)X
-1033(the)X
-1161(cache)X
-1375(and)X
-1521(issued)X
-1751(read-only)X
-2089(transactions.)X
-2541(The)X
-2695(results)X
-2933(in)X
-3024(\256gure)X
-3240(\256ve)X
-3389(express)X
-3659(the)X
-3786(kernel)X
-4016(call)X
-4161(syn-)X
-555 2406(chronization)N
-980(performance)X
-1411(as)X
-1502(a)X
-1562(percentage)X
-1935(of)X
-2026(the)X
-2148(spinlock)X
-2443(performance.)X
-2914(For)X
-3049(example,)X
-3365(in)X
-3451(the)X
-3573(1)X
-3637(disk)X
-3794(case,)X
-3977(the)X
-4098(kernel)X
-555 2496(call)N
-697(implementation)X
-1225(achieved)X
-1537(4.4)X
-1662(TPS)X
-1824(\(transactions)X
-2259(per)X
-2387(second\))X
-2662(while)X
-2865(the)X
-2988(semaphore)X
-3361(implementation)X
-3888(achieved)X
-4199(4.6)X
-555 2586(TPS,)N
-735(and)X
-874(the)X
-995(relative)X
-1259(performance)X
-1689(of)X
-1779(the)X
-1900(kernel)X
-2123(synchronization)X
-2657(is)X
-2732(96%)X
-2901(that)X
-3043(of)X
-3132(the)X
-3252(spinlock)X
-3545(\(100)X
-3714(*)X
-3776(4.4)X
-3898(/)X
-3942(4.6\).)X
-4111(There)X
-555 2676(are)N
-674(two)X
-814(striking)X
-1078(observations)X
-1503(from)X
-1679(these)X
-1864(results:)X
-10 f
-635 2799(g)N
-1 f
-755(even)X
-927(when)X
-1121(the)X
-1239(system)X
-1481(is)X
-1554(disk)X
-1707(bound,)X
-1947(the)X
-2065(CPU)X
-2240(cost)X
-2389(of)X
-2476(synchronization)X
-3008(is)X
-3081(noticeable,)X
-3451(and)X
-10 f
-635 2922(g)N
-1 f
-755(when)X
-949(we)X
-1063(are)X
-1182(CPU)X
-1357(bound,)X
-1597(the)X
-1715(difference)X
-2062(is)X
-2135(dramatic)X
-2436(\(67%\).)X
-3 f
-555 3108(4.4.)N
-715(Transaction)X
-1148(Protected)X
-1499(Access)X
-1747(Methods)X
-1 f
-755 3231(The)N
-903(B-tree)X
-1127(and)X
-1266(\256xed)X
-1449(length)X
-1671(recno)X
-1872(\(record)X
-2127(number\))X
-2421(access)X
-2649(methods)X
-2942(have)X
-3116(been)X
-3290(modi\256ed)X
-3596(to)X
-3680(provide)X
-3947(transaction)X
-555 3321(protection.)N
-941(Whereas)X
-1244(the)X
-1363(previously)X
-1722(published)X
-2054(interface)X
-2357(to)X
-2440(the)X
-2559(access)X
-2786(routines)X
-3065(had)X
-3202(separate)X
-3487(open)X
-3664(calls)X
-3832(for)X
-3946(each)X
-4114(of)X
-4201(the)X
-10 f
-555 3507(h)N
-579(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)X
-1 Dt
-2978 5036 MXY
- 2978 5036 lineto
- 2978 4662 lineto
- 3093 4662 lineto
- 3093 5036 lineto
- 2978 5036 lineto
-closepath 21 2978 4662 3093 5036 Dp
-2518 MX
- 2518 5036 lineto
- 2518 3960 lineto
- 2633 3960 lineto
- 2633 5036 lineto
- 2518 5036 lineto
-closepath 3 2518 3960 2633 5036 Dp
-2059 MX
- 2059 5036 lineto
- 2059 3946 lineto
- 2174 3946 lineto
- 2174 5036 lineto
- 2059 5036 lineto
-closepath 1 2059 3946 2174 5036 Dp
-3 f
-7 s
-2912 5141(Read-only)N
-1426 3767(of)N
-1487(Spinlock)X
-1710(Throughput)X
-1480 3710(Throughput)N
-1786(as)X
-1850(a)X
-1892(%)X
-11 s
-1670 4843(20)N
-1670 4614(40)N
-1670 4384(60)N
-1670 4155(80)N
-1648 3925(100)N
-7 s
-2041 5141(1)N
-2083(Disk)X
-2490(2)X
-2532(Disks)X
-5 Dt
-1829 5036 MXY
-1494 0 Dl
-4 Ds
-1 Dt
-1829 4806 MXY
-1494 0 Dl
-1829 4577 MXY
-1494 0 Dl
-1829 4347 MXY
-1494 0 Dl
-1829 4118 MXY
-1494 0 Dl
-1829 3888 MXY
-1494 0 Dl
-3 Dt
--1 Ds
-8 s
-555 5360(Figure)N
-753(5:)X
-823(Kernel)X
-1028(Overhead)X
-1315(for)X
-1413(System)X
-1625(Call)X
-1756(Synchronization.)X
-1 f
-2254(The)X
-2370(performance)X
-2708(of)X
-2778(the)X
-2873(kernel)X
-3049(call)X
-3158(synchronization)X
-3583(is)X
-3643(expressed)X
-3911(as)X
-3980(a)X
-4024(percentage)X
-555 5450(of)N
-625(the)X
-720(spinlock)X
-954(synchronization)X
-1379(performance.)X
-1749(In)X
-1819(disk)X
-1943(bound)X
-2120(cases)X
-2271(\(1)X
-2341(Disk)X
-2479(and)X
-2588(2)X
-2637(Disks\),)X
-2837(we)X
-2928(see)X
-3026(that)X
-3139(4-6%)X
-3294(of)X
-3364(the)X
-3459(performance)X
-3797(is)X
-3857(lost)X
-3966(due)X
-4074(to)X
-4140(kernel)X
-555 5540(calls)N
-688(while)X
-846(in)X
-912(the)X
-1006(CPU)X
-1147(bound)X
-1323(case,)X
-1464(we)X
-1554(have)X
-1690(lost)X
-1799(67%)X
-1932(of)X
-2001(the)X
-2095(performance)X
-2432(due)X
-2540(to)X
-2606(kernel)X
-2781(calls.)X
-
-10 p
-%%Page: 10 10
-8 s 8 xH 0 xS 1 f
-10 s
-3 f
-1 f
-555 630(access)N
-781(methods,)X
-1092(we)X
-1206(now)X
-1364(have)X
-1536(an)X
-1632(integrated)X
-1973(open)X
-2149(call)X
-2285(with)X
-2447(the)X
-2565(following)X
-2896(calling)X
-3134(conventions:)X
-7 f
-715 753(DB)N
-859(*dbopen)X
-1243(\(const)X
-1579(char)X
-1819(*file,)X
-2155(int)X
-2347(flags,)X
-2683(int)X
-2875(mode,)X
-3163(DBTYPE)X
-3499(type,)X
-1291 843(int)N
-1483(dbflags,)X
-1915(const)X
-2203(void)X
-2443(*openinfo\))X
-1 f
-555 966(where)N
-2 f
-774(\256le)X
-1 f
-894(is)X
-969(the)X
-1089(name)X
-1285(of)X
-1374(the)X
-1494(\256le)X
-1618(being)X
-1818(opened,)X
-2 f
-2092(\257ags)X
-1 f
-2265(and)X
-2 f
-2402(mode)X
-1 f
-2597(are)X
-2717(the)X
-2836(standard)X
-3129(arguments)X
-3484(to)X
-3 f
-3567(open)X
-1 f
-3731(\(2\),)X
-2 f
-3866(type)X
-1 f
-4021(is)X
-4095(one)X
-4232(of)X
-555 1056(the)N
-680(access)X
-913(method)X
-1180(types,)X
-2 f
-1396(db\257ags)X
-1 f
-1654(indicates)X
-1966(the)X
-2091(mode)X
-2296(of)X
-2390(the)X
-2515(buffer)X
-2739(pool)X
-2907(and)X
-3049(transaction)X
-3427(protection,)X
-3798(and)X
-2 f
-3940(openinfo)X
-1 f
-4246(is)X
-555 1146(the)N
-681(access)X
-915(method)X
-1183(speci\256c)X
-1456(information.)X
-1902(Currently,)X
-2257(the)X
-2383(possible)X
-2673(values)X
-2906(for)X
-2 f
-3028(db\257ags)X
-1 f
-3287(are)X
-3414(DB_SHARED)X
-3912(and)X
-4055(DB_TP)X
-555 1236(indicating)N
-895(that)X
-1035(buffers)X
-1283(should)X
-1516(be)X
-1612(kept)X
-1770(in)X
-1852(a)X
-1908(shared)X
-2138(buffer)X
-2355(pool)X
-2517(and)X
-2653(that)X
-2793(the)X
-2911(\256le)X
-3033(should)X
-3266(be)X
-3362(transaction)X
-3734(protected.)X
-755 1359(The)N
-900(modi\256cations)X
-1355(required)X
-1643(to)X
-1725(add)X
-1861(transaction)X
-2233(protection)X
-2578(to)X
-2660(an)X
-2756(access)X
-2982(method)X
-3242(are)X
-3361(quite)X
-3541(simple)X
-3774(and)X
-3910(localized.)X
-715 1482(1.)N
-795(Replace)X
-1074(\256le)X
-2 f
-1196(open)X
-1 f
-1372(with)X
-2 f
-1534(buf_open)X
-1 f
-1832(.)X
-715 1572(2.)N
-795(Replace)X
-1074(\256le)X
-2 f
-1196(read)X
-1 f
-1363(and)X
-2 f
-1499(write)X
-1 f
-1683(calls)X
-1850(with)X
-2012(buffer)X
-2229(manager)X
-2526(calls)X
-2693(\()X
-2 f
-2720(buf_get)X
-1 f
-(,)S
-2 f
-3000(buf_unpin)X
-1 f
-3324(\).)X
-715 1662(3.)N
-795(Precede)X
-1070(buffer)X
-1287(manager)X
-1584(calls)X
-1751(with)X
-1913(an)X
-2009(appropriate)X
-2395(\(read)X
-2581(or)X
-2668(write\))X
-2880(lock)X
-3038(call.)X
-715 1752(4.)N
-795(Before)X
-1034(updates,)X
-1319(issue)X
-1499(a)X
-1555(logging)X
-1819(operation.)X
-715 1842(5.)N
-795(After)X
-985(data)X
-1139(have)X
-1311(been)X
-1483(accessed,)X
-1805(release)X
-2049(the)X
-2167(buffer)X
-2384(manager)X
-2681(pin.)X
-715 1932(6.)N
-795(Provide)X
-1064(undo/redo)X
-1409(code)X
-1581(for)X
-1695(each)X
-1863(type)X
-2021(of)X
-2108(log)X
-2230(record)X
-2456(de\256ned.)X
-555 2071(The)N
-702(following)X
-1035(code)X
-1209(fragments)X
-1552(show)X
-1743(how)X
-1903(to)X
-1987(transaction)X
-2361(protect)X
-2606(several)X
-2856(updates)X
-3123(to)X
-3206(a)X
-3263(B-tree.)X
-7 s
-3484 2039(3)N
-10 s
-3533 2071(In)N
-3621(the)X
-3740(unprotected)X
-4140(case,)X
-555 2161(an)N
-652(open)X
-829(call)X
-966(is)X
-1040(followed)X
-1346(by)X
-1447(a)X
-1504(read)X
-1664(call)X
-1801(to)X
-1884(obtain)X
-2105(the)X
-2224(meta-data)X
-2562(for)X
-2677(the)X
-2796(B-tree.)X
-3058(Instead,)X
-3331(we)X
-3446(issue)X
-3627(an)X
-3724(open)X
-3901(to)X
-3984(the)X
-4102(buffer)X
-555 2251(manager)N
-852(to)X
-934(obtain)X
-1154(a)X
-1210(\256le)X
-1332(id)X
-1414(and)X
-1550(a)X
-1606(buffer)X
-1823(request)X
-2075(to)X
-2157(obtain)X
-2377(the)X
-2495(meta-data)X
-2832(as)X
-2919(shown)X
-3148(below.)X
-7 f
-715 2374(char)N
-955(*path;)X
-715 2464(int)N
-907(fid,)X
-1147(flags,)X
-1483(len,)X
-1723(mode;)X
-715 2644(/*)N
-859(Obtain)X
-1195(a)X
-1291(file)X
-1531(id)X
-1675(with)X
-1915(which)X
-2203(to)X
-2347(access)X
-2683(the)X
-2875(buffer)X
-3211(pool)X
-3451(*/)X
-715 2734(fid)N
-907(=)X
-1003(buf_open\(path,)X
-1723(flags,)X
-2059(mode\);)X
-715 2914(/*)N
-859(Read)X
-1099(the)X
-1291(meta)X
-1531(data)X
-1771(\(page)X
-2059(0\))X
-2203(for)X
-2395(the)X
-2587(B-tree)X
-2923(*/)X
-715 3004(if)N
-859(\(tp_lock\(fid,)X
-1531(0,)X
-1675(READ_LOCK\)\))X
-1003 3094(return)N
-1339(error;)X
-715 3184(meta_data_ptr)N
-1387(=)X
-1483(buf_get\(fid,)X
-2107(0,)X
-2251(BF_PIN,)X
-2635(&len\);)X
-1 f
-555 3307(The)N
-714(BF_PIN)X
-1014(argument)X
-1350(to)X
-2 f
-1445(buf_get)X
-1 f
-1718(indicates)X
-2036(that)X
-2189(we)X
-2316(wish)X
-2500(to)X
-2595(leave)X
-2798(this)X
-2946(page)X
-3131(pinned)X
-3382(in)X
-3477(memory)X
-3777(so)X
-3881(that)X
-4034(it)X
-4111(is)X
-4197(not)X
-555 3397(swapped)N
-862(out)X
-990(while)X
-1194(we)X
-1314(are)X
-1439(accessing)X
-1772(it.)X
-1881(The)X
-2031(last)X
-2167(argument)X
-2495(to)X
-2 f
-2582(buf_get)X
-1 f
-2847(returns)X
-3095(the)X
-3218(number)X
-3488(of)X
-3580(bytes)X
-3774(on)X
-3879(the)X
-4002(page)X
-4179(that)X
-555 3487(were)N
-732(valid)X
-912(so)X
-1003(that)X
-1143(the)X
-1261(access)X
-1487(method)X
-1747(may)X
-1905(initialize)X
-2205(the)X
-2323(page)X
-2495(if)X
-2564(necessary.)X
-755 3610(Next,)N
-955(consider)X
-1251(inserting)X
-1555(a)X
-1615(record)X
-1845(on)X
-1949(a)X
-2009(particular)X
-2341(page)X
-2517(of)X
-2608(a)X
-2668(B-tree.)X
-2932(In)X
-3022(the)X
-3143(unprotected)X
-3545(case,)X
-3727(we)X
-3844(read)X
-4006(the)X
-4127(page,)X
-555 3700(call)N
-2 f
-693(_bt_insertat)X
-1 f
-1079(,)X
-1121(and)X
-1258(write)X
-1444(the)X
-1563(page.)X
-1776(Instead,)X
-2049(we)X
-2164(lock)X
-2323(the)X
-2442(page,)X
-2635(request)X
-2888(the)X
-3007(buffer,)X
-3245(log)X
-3368(the)X
-3487(change,)X
-3756(modify)X
-4008(the)X
-4127(page,)X
-555 3790(and)N
-691(release)X
-935(the)X
-1053(buffer.)X
-7 f
-715 3913(int)N
-907(fid,)X
-1147(len,)X
-1387(pageno;)X
-1867(/*)X
-2011(Identifies)X
-2539(the)X
-2731(buffer)X
-3067(*/)X
-715 4003(int)N
-907(index;)X
-1867(/*)X
-2011(Location)X
-2443(at)X
-2587(which)X
-2875(to)X
-3019(insert)X
-3355(the)X
-3547(new)X
-3739(pair)X
-3979(*/)X
-715 4093(DBT)N
-907(*keyp,)X
-1243(*datap;)X
-1867(/*)X
-2011(Key/Data)X
-2443(pair)X
-2683(to)X
-2827(be)X
-2971(inserted)X
-3403(*/)X
-715 4183(DATUM)N
-1003(*d;)X
-1867(/*)X
-2011(Key/data)X
-2443(structure)X
-2923(to)X
-3067(insert)X
-3403(*/)X
-715 4363(/*)N
-859(Lock)X
-1099(and)X
-1291(request)X
-1675(the)X
-1867(buffer)X
-2203(*/)X
-715 4453(if)N
-859(\(tp_lock\(fid,)X
-1531(pageno,)X
-1915(WRITE_LOCK\)\))X
-1003 4543(return)N
-1339(error;)X
-715 4633(buffer_ptr)N
-1243(=)X
-1339(buf_get\(fid,)X
-1963(pageno,)X
-2347(BF_PIN,)X
-2731(&len\);)X
-715 4813(/*)N
-859(Log)X
-1051(and)X
-1243(perform)X
-1627(the)X
-1819(update)X
-2155(*/)X
-715 4903(log_insdel\(BTREE_INSERT,)N
-1915(fid,)X
-2155(pageno,)X
-2539(keyp,)X
-2827(datap\);)X
-715 4993(_bt_insertat\(buffer_ptr,)N
-1915(d,)X
-2059(index\);)X
-715 5083(buf_unpin\(buffer_ptr\);)N
-1 f
-555 5206(Succinctly,)N
-942(the)X
-1068(algorithm)X
-1407(for)X
-1529(turning)X
-1788(unprotected)X
-2195(code)X
-2375(into)X
-2527(protected)X
-2854(code)X
-3034(is)X
-3115(to)X
-3205(replace)X
-3466(read)X
-3633(operations)X
-3995(with)X
-2 f
-4165(lock)X
-1 f
-555 5296(and)N
-2 f
-691(buf_get)X
-1 f
-951(operations)X
-1305(and)X
-1441(write)X
-1626(operations)X
-1980(with)X
-2 f
-2142(log)X
-1 f
-2264(and)X
-2 f
-2400(buf_unpin)X
-1 f
-2744(operations.)X
-8 s
-10 f
-555 5458(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)N
-5 s
-1 f
-727 5536(3)N
-8 s
-766 5561(The)N
-884(following)X
-1152(code)X
-1291(fragments)X
-1565(are)X
-1661(examples,)X
-1937(but)X
-2038(do)X
-2120(not)X
-2220(de\256ne)X
-2394(the)X
-2490(\256nal)X
-2622(interface.)X
-2894(The)X
-3011(\256nal)X
-3143(interface)X
-3383(will)X
-3501(be)X
-3579(determined)X
-3884(after)X
-4018(LIBTP)X
-4214(has)X
-555 5633(been)N
-691(fully)X
-828(integrated)X
-1099(with)X
-1229(the)X
-1323(most)X
-1464(recent)X
-3 f
-1635(db)X
-1 f
-1707(\(3\))X
-1797(release)X
-1989(from)X
-2129(the)X
-2223(Computer)X
-2495(Systems)X
-2725(Research)X
-2974(Group)X
-3153(at)X
-3215(University)X
-3501(of)X
-3570(California,)X
-3861(Berkeley.)X
-
-11 p
-%%Page: 11 11
-8 s 8 xH 0 xS 1 f
-10 s
-3 f
-555 630(5.)N
-655(Performance)X
-1 f
-755 753(In)N
-845(this)X
-983(section,)X
-1253(we)X
-1370(present)X
-1625(the)X
-1746(results)X
-1978(of)X
-2067(two)X
-2209(very)X
-2374(different)X
-2673(benchmarks.)X
-3103(The)X
-3250(\256rst)X
-3396(is)X
-3471(an)X
-3569(online)X
-3791(transaction)X
-4165(pro-)X
-555 843(cessing)N
-824(benchmark,)X
-1234(similar)X
-1489(to)X
-1584(the)X
-1715(standard)X
-2020(TPCB,)X
-2272(but)X
-2407(has)X
-2547(been)X
-2732(adapted)X
-3015(to)X
-3110(run)X
-3250(in)X
-3345(a)X
-3414(desktop)X
-3696(environment.)X
-4174(The)X
-555 933(second)N
-798(emulates)X
-1103(a)X
-1159(computer-aided)X
-1683(design)X
-1912(environment)X
-2337(and)X
-2473(provides)X
-2769(more)X
-2954(complex)X
-3250(query)X
-3453(processing.)X
-3 f
-555 1119(5.1.)N
-715(Transaction)X
-1148(Processing)X
-1533(Benchmark)X
-1 f
-755 1242(For)N
-887(this)X
-1023(section,)X
-1291(all)X
-1392(performance)X
-1820(numbers)X
-2117(shown)X
-2346(except)X
-2576(for)X
-2690(the)X
-2808(commercial)X
-3207(database)X
-3504(system)X
-3746(were)X
-3923(obtained)X
-4219(on)X
-555 1332(a)N
-614(DECstation)X
-1009(5000/200)X
-1333(with)X
-1497(32MBytes)X
-1852(of)X
-1941(memory)X
-2230(running)X
-2501(Ultrix)X
-2714(V4.0,)X
-2914(accessing)X
-3244(a)X
-3302(DEC)X
-3484(RZ57)X
-3688(1GByte)X
-3959(disk)X
-4114(drive.)X
-555 1422(The)N
-720(commercial)X
-1139(relational)X
-1482(database)X
-1799(system)X
-2061(tests)X
-2242(were)X
-2438(run)X
-2584(on)X
-2703(a)X
-2778(comparable)X
-3192(machine,)X
-3523(a)X
-3598(Sparcstation)X
-4033(1+)X
-4157(with)X
-555 1512(32MBytes)N
-915(memory)X
-1209(and)X
-1352(a)X
-1415(1GByte)X
-1691(external)X
-1976(disk)X
-2135(drive.)X
-2366(The)X
-2517(database,)X
-2840(binaries)X
-3120(and)X
-3262(log)X
-3390(resided)X
-3648(on)X
-3754(the)X
-3878(same)X
-4069(device.)X
-555 1602(Reported)N
-869(times)X
-1062(are)X
-1181(the)X
-1299(means)X
-1524(of)X
-1611(\256ve)X
-1751(tests)X
-1913(and)X
-2049(have)X
-2221(standard)X
-2513(deviations)X
-2862(within)X
-3086(two)X
-3226(percent)X
-3483(of)X
-3570(the)X
-3688(mean.)X
-755 1725(The)N
-905(test)X
-1041(database)X
-1343(was)X
-1493(con\256gured)X
-1861(according)X
-2203(to)X
-2290(the)X
-2413(TPCB)X
-2637(scaling)X
-2889(rules)X
-3070(for)X
-3189(a)X
-3250(10)X
-3355(transaction)X
-3732(per)X
-3860(second)X
-4108(\(TPS\))X
-555 1815(system)N
-817(with)X
-999(1,000,000)X
-1359(account)X
-1649(records,)X
-1946(100)X
-2106(teller)X
-2311(records,)X
-2607(and)X
-2762(10)X
-2881(branch)X
-3139(records.)X
-3455(Where)X
-3709(TPS)X
-3885(numbers)X
-4200(are)X
-555 1905(reported,)N
-865(we)X
-981(are)X
-1102(running)X
-1373(a)X
-1431(modi\256ed)X
-1737(version)X
-1995(of)X
-2084(the)X
-2203(industry)X
-2486(standard)X
-2779(transaction)X
-3152(processing)X
-3516(benchmark,)X
-3914(TPCB.)X
-4174(The)X
-555 1995(TPCB)N
-780(benchmark)X
-1163(simulates)X
-1491(a)X
-1553(withdrawal)X
-1940(performed)X
-2301(by)X
-2407(a)X
-2469(hypothetical)X
-2891(teller)X
-3082(at)X
-3166(a)X
-3228(hypothetical)X
-3650(bank.)X
-3872(The)X
-4022(database)X
-555 2085(consists)N
-831(of)X
-921(relations)X
-1220(\(\256les\))X
-1430(for)X
-1547(accounts,)X
-1871(branches,)X
-2200(tellers,)X
-2439(and)X
-2578(history.)X
-2863(For)X
-2997(each)X
-3168(transaction,)X
-3563(the)X
-3684(account,)X
-3976(teller,)X
-4183(and)X
-555 2175(branch)N
-795(balances)X
-1093(must)X
-1269(be)X
-1366(updated)X
-1641(to)X
-1724(re\257ect)X
-1946(the)X
-2065(withdrawal)X
-2447(and)X
-2584(a)X
-2640(history)X
-2882(record)X
-3108(is)X
-3181(written)X
-3428(which)X
-3644(contains)X
-3931(the)X
-4049(account)X
-555 2265(id,)N
-657(branch)X
-896(id,)X
-998(teller)X
-1183(id,)X
-1285(and)X
-1421(the)X
-1539(amount)X
-1799(of)X
-1886(the)X
-2004(withdrawal)X
-2385([TPCB90].)X
-755 2388(Our)N
-914(implementation)X
-1450(of)X
-1551(the)X
-1683(benchmark)X
-2074(differs)X
-2317(from)X
-2506(the)X
-2637(speci\256cation)X
-3075(in)X
-3170(several)X
-3431(aspects.)X
-3736(The)X
-3894(speci\256cation)X
-555 2478(requires)N
-840(that)X
-985(the)X
-1108(database)X
-1410(keep)X
-1587(redundant)X
-1933(logs)X
-2091(on)X
-2196(different)X
-2498(devices,)X
-2784(but)X
-2911(we)X
-3030(use)X
-3162(a)X
-3223(single)X
-3439(log.)X
-3606(Furthermore,)X
-4052(all)X
-4157(tests)X
-555 2568(were)N
-734(run)X
-863(on)X
-965(a)X
-1023(single,)X
-1256(centralized)X
-1631(system)X
-1875(so)X
-1968(there)X
-2151(is)X
-2226(no)X
-2328(notion)X
-2553(of)X
-2641(remote)X
-2885(accesses.)X
-3219(Finally,)X
-3486(we)X
-3601(calculated)X
-3948(throughput)X
-555 2658(by)N
-662(dividing)X
-955(the)X
-1080(total)X
-1249(elapsed)X
-1517(time)X
-1686(by)X
-1793(the)X
-1918(number)X
-2190(of)X
-2284(transactions)X
-2694(processed)X
-3038(rather)X
-3253(than)X
-3418(by)X
-3525(computing)X
-3894(the)X
-4018(response)X
-555 2748(time)N
-717(for)X
-831(each)X
-999(transaction.)X
-755 2871(The)N
-912(performance)X
-1351(comparisons)X
-1788(focus)X
-1993(on)X
-2104(traditional)X
-2464(Unix)X
-2655(techniques)X
-3029(\(unprotected,)X
-3486(using)X
-3 f
-3690(\257ock)X
-1 f
-3854(\(2\))X
-3979(and)X
-4126(using)X
-3 f
-555 2961(fsync)N
-1 f
-733(\(2\)\))X
-884(and)X
-1030(a)X
-1096(commercial)X
-1504(relational)X
-1836(database)X
-2142(system.)X
-2433(Well-behaved)X
-2913(applications)X
-3329(using)X
-3 f
-3531(\257ock)X
-1 f
-3695(\(2\))X
-3818(are)X
-3946(guaranteed)X
-555 3051(that)N
-704(concurrent)X
-1077(processes')X
-1441(updates)X
-1715(do)X
-1824(not)X
-1955(interact)X
-2225(with)X
-2396(one)X
-2541(another,)X
-2831(but)X
-2962(no)X
-3070(guarantees)X
-3442(about)X
-3648(atomicity)X
-3978(are)X
-4105(made.)X
-555 3141(That)N
-731(is,)X
-833(if)X
-911(the)X
-1038(system)X
-1289(crashes)X
-1555(in)X
-1646(mid-transaction,)X
-2198(only)X
-2369(parts)X
-2554(of)X
-2649(that)X
-2797(transaction)X
-3177(will)X
-3329(be)X
-3433(re\257ected)X
-3738(in)X
-3828(the)X
-3954 0.3125(after-crash)AX
-555 3231(state)N
-725(of)X
-815(the)X
-936(database.)X
-1276(The)X
-1424(use)X
-1554(of)X
-3 f
-1643(fsync)X
-1 f
-1821(\(2\))X
-1937(at)X
-2017(transaction)X
-2391(commit)X
-2657(time)X
-2821(provides)X
-3119(guarantees)X
-3485(of)X
-3574(durability)X
-3907(after)X
-4077(system)X
-555 3321(failure.)N
-825(However,)X
-1160(there)X
-1341(is)X
-1414(no)X
-1514(mechanism)X
-1899(to)X
-1981(perform)X
-2260(transaction)X
-2632(abort.)X
-3 f
-555 3507(5.1.1.)N
-775(Single-User)X
-1191(Tests)X
-1 f
-755 3630(These)N
-978(tests)X
-1151(compare)X
-1459(LIBTP)X
-1712(in)X
-1804(a)X
-1870(variety)X
-2123(of)X
-2220(con\256gurations)X
-2708(to)X
-2800(traditional)X
-3159(UNIX)X
-3390(solutions)X
-3708(and)X
-3854(a)X
-3920(commercial)X
-555 3720(relational)N
-884(database)X
-1187(system)X
-1435(\(RDBMS\).)X
-1814(To)X
-1929(demonstrate)X
-2347(the)X
-2471(server)X
-2694(architecture)X
-3100(we)X
-3220(built)X
-3392(a)X
-3454(front)X
-3636(end)X
-3777(test)X
-3913(process)X
-4179(that)X
-555 3810(uses)N
-732(TCL)X
-922([OUST90])X
-1304(to)X
-1405(parse)X
-1614(database)X
-1930(access)X
-2175(commands)X
-2561(and)X
-2716(call)X
-2870(the)X
-3006(database)X
-3321(access)X
-3565(routines.)X
-3901(In)X
-4006(one)X
-4160(case)X
-555 3900(\(SERVER\),)N
-956(frontend)X
-1249(and)X
-1386(backend)X
-1675(processes)X
-2004(were)X
-2181(created)X
-2434(which)X
-2650(communicated)X
-3142(via)X
-3260(an)X
-3356(IP)X
-3447(socket.)X
-3712(In)X
-3799(the)X
-3917(second)X
-4160(case)X
-555 3990(\(TCL\),)N
-802(a)X
-860(single)X
-1073(process)X
-1336(read)X
-1497(queries)X
-1751(from)X
-1929(standard)X
-2223(input,)X
-2429(parsed)X
-2660(them,)X
-2861(and)X
-2998(called)X
-3211(the)X
-3330(database)X
-3628(access)X
-3855(routines.)X
-4174(The)X
-555 4080(performance)N
-987(difference)X
-1338(between)X
-1630(the)X
-1752(TCL)X
-1927(and)X
-2067(SERVER)X
-2397(tests)X
-2563(quanti\256es)X
-2898(the)X
-3020(communication)X
-3542(overhead)X
-3861(of)X
-3952(the)X
-4074(socket.)X
-555 4170(The)N
-732(RDBMS)X
-1063(implementation)X
-1617(used)X
-1816(embedded)X
-2198(SQL)X
-2401(in)X
-2515(C)X
-2620(with)X
-2814(stored)X
-3062(database)X
-3391(procedures.)X
-3835(Therefore,)X
-4224(its)X
-555 4260(con\256guration)N
-1003(is)X
-1076(a)X
-1132(hybrid)X
-1361(of)X
-1448(the)X
-1566(single)X
-1777(process)X
-2038(architecture)X
-2438(and)X
-2574(the)X
-2692(server)X
-2909(architecture.)X
-3349(The)X
-3494(graph)X
-3697(in)X
-3779(\256gure)X
-3986(six)X
-4099(shows)X
-555 4350(a)N
-611(comparison)X
-1005(of)X
-1092(the)X
-1210(following)X
-1541(six)X
-1654(con\256gurations:)X
-1126 4506(LIBTP)N
-1552(Uses)X
-1728(the)X
-1846(LIBTP)X
-2088(library)X
-2322(in)X
-2404(a)X
-2460(single)X
-2671(application.)X
-1126 4596(TCL)N
-1552(Uses)X
-1728(the)X
-1846(LIBTP)X
-2088(library)X
-2322(in)X
-2404(a)X
-2460(single)X
-2671(application,)X
-3067(requires)X
-3346(query)X
-3549(parsing.)X
-1126 4686(SERVER)N
-1552(Uses)X
-1728(the)X
-1846(LIBTP)X
-2088(library)X
-2322(in)X
-2404(a)X
-2460(server)X
-2677(con\256guration,)X
-3144(requires)X
-3423(query)X
-3626(parsing.)X
-1126 4776(NOTP)N
-1552(Uses)X
-1728(no)X
-1828(locking,)X
-2108(logging,)X
-2392(or)X
-2479(concurrency)X
-2897(control.)X
-1126 4866(FLOCK)N
-1552(Uses)X
-3 f
-1728(\257ock)X
-1 f
-1892(\(2\))X
-2006(for)X
-2120(concurrency)X
-2538(control)X
-2785(and)X
-2921(nothing)X
-3185(for)X
-3299(durability.)X
-1126 4956(FSYNC)N
-1552(Uses)X
-3 f
-1728(fsync)X
-1 f
-1906(\(2\))X
-2020(for)X
-2134(durability)X
-2465(and)X
-2601(nothing)X
-2865(for)X
-2979(concurrency)X
-3397(control.)X
-1126 5046(RDBMS)N
-1552(Uses)X
-1728(a)X
-1784(commercial)X
-2183(relational)X
-2506(database)X
-2803(system.)X
-755 5235(The)N
-902(results)X
-1133(show)X
-1324(that)X
-1466(LIBTP,)X
-1730(both)X
-1894(in)X
-1978(the)X
-2098(procedural)X
-2464(and)X
-2602(parsed)X
-2834(environments,)X
-3312(is)X
-3387(competitive)X
-3787(with)X
-3951(a)X
-4009(commer-)X
-555 5325(cial)N
-692(system)X
-935(\(comparing)X
-1326(LIBTP,)X
-1589(TCL,)X
-1781(and)X
-1917(RDBMS\).)X
-2263(Compared)X
-2617(to)X
-2699(existing)X
-2972(UNIX)X
-3193(solutions,)X
-3521(LIBTP)X
-3763(is)X
-3836(approximately)X
-555 5415(15%)N
-738(slower)X
-988(than)X
-1162(using)X
-3 f
-1371(\257ock)X
-1 f
-1535(\(2\))X
-1665(or)X
-1768(no)X
-1884(protection)X
-2245(but)X
-2383(over)X
-2562(80%)X
-2745(better)X
-2964(than)X
-3137(using)X
-3 f
-3345(fsync)X
-1 f
-3523(\(2\))X
-3652(\(comparing)X
-4057(LIBTP,)X
-555 5505(FLOCK,)N
-857(NOTP,)X
-1106(and)X
-1242(FSYNC\).)X
-
-12 p
-%%Page: 12 12
-10 s 10 xH 0 xS 1 f
-3 f
-8 s
-3500 2184(RDBMS)N
-1 Dt
-3553 2085 MXY
- 3553 2085 lineto
- 3676 2085 lineto
- 3676 1351 lineto
- 3553 1351 lineto
- 3553 2085 lineto
-closepath 16 3553 1351 3676 2085 Dp
-2018 2184(SERVER)N
-1720 1168 MXY
-0 917 Dl
-122 0 Dl
-0 -917 Dl
--122 0 Dl
-1715 2184(TCL)N
-2087 1534 MXY
- 2087 1534 lineto
- 2209 1534 lineto
- 2209 2085 lineto
- 2087 2085 lineto
- 2087 1534 lineto
-closepath 12 2087 1534 2209 2085 Dp
-3187 MX
- 3187 1534 lineto
- 3309 1534 lineto
- 3309 2085 lineto
- 3187 2085 lineto
- 3187 1534 lineto
-closepath 19 3187 1534 3309 2085 Dp
-3142 2184(FSYNC)N
-2425(NOTP)X
-2453 955 MXY
- 2453 955 lineto
- 2576 955 lineto
- 2576 2085 lineto
- 2453 2085 lineto
- 2453 955 lineto
-closepath 21 2453 955 2576 2085 Dp
-2820 1000 MXY
- 2820 1000 lineto
- 2942 1000 lineto
- 2942 2085 lineto
- 2820 2085 lineto
- 2820 1000 lineto
-closepath 14 2820 1000 2942 2085 Dp
-5 Dt
-1231 2085 MXY
-2567 0 Dl
-4 Ds
-1 Dt
-1231 1840 MXY
-2567 0 Dl
-1231 1596 MXY
-2567 0 Dl
-1231 1351 MXY
-2567 0 Dl
-1231 1108 MXY
-2567 0 Dl
-1231 863 MXY
-2567 0 Dl
-11 s
-1087 1877(2)N
-1087 1633(4)N
-1087 1388(6)N
-1087 1145(8)N
-1065 900(10)N
-1028 763(TPS)N
--1 Ds
-1353 2085 MXY
- 1353 2085 lineto
- 1353 1151 lineto
- 1476 1151 lineto
- 1476 2085 lineto
- 1353 2085 lineto
-closepath 3 1353 1151 1476 2085 Dp
-8 s
-1318 2184(LIBTP)N
-2767(FLOCK)X
-3 Dt
--1 Ds
-10 s
-1597 2399(Figure)N
-1844(6:)X
-1931(Single-User)X
-2347(Performance)X
-2814(Comparison.)X
-1 f
-10 f
-555 2579(h)N
-579(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)X
-3 f
-555 2855(5.1.2.)N
-775(Multi-User)X
-1174(Tests)X
-1 f
-755 2978(While)N
-975(the)X
-1097(single-user)X
-1473(tests)X
-1639(form)X
-1819(a)X
-1878(basis)X
-2061(for)X
-2178(comparing)X
-2544(LIBTP)X
-2789(to)X
-2874(other)X
-3062(systems,)X
-3358(our)X
-3488(goal)X
-3649(in)X
-3734(multi-user)X
-4086(testing)X
-555 3068(was)N
-714(to)X
-810(analyze)X
-1089(its)X
-1197(scalability.)X
-1579(To)X
-1701(this)X
-1849(end,)X
-2018(we)X
-2145(have)X
-2330(run)X
-2470(the)X
-2601(benchmark)X
-2991(in)X
-3086(three)X
-3280(modes,)X
-3542(the)X
-3673(normal)X
-3933(disk)X
-4099(bound)X
-555 3158(con\256guration)N
-1010(\(\256gure)X
-1252(seven\),)X
-1510(a)X
-1573(CPU)X
-1755(bound)X
-1982(con\256guration)X
-2436(\(\256gure)X
-2677(eight,)X
-2884(READ-ONLY\),)X
-3426(and)X
-3569(lock)X
-3734(contention)X
-4099(bound)X
-555 3248(\(\256gure)N
-796(eight,)X
-1003(NO_FSYNC\).)X
-1510(Since)X
-1715(the)X
-1840(normal)X
-2094(con\256guration)X
-2548(is)X
-2628(completely)X
-3011(disk)X
-3171(bound)X
-3398(\(each)X
-3600(transaction)X
-3978(requires)X
-4263(a)X
-555 3354(random)N
-823(read,)X
-1005(a)X
-1064(random)X
-1332(write,)X
-1540(and)X
-1679(a)X
-1738(sequential)X
-2086(write)X
-7 s
-2251 3322(4)N
-10 s
-3354(\))Y
-2329(we)X
-2446(expect)X
-2679(to)X
-2764(see)X
-2890(little)X
-3059(performance)X
-3489(improvement)X
-3939(as)X
-4028(the)X
-4148(mul-)X
-555 3444(tiprogramming)N
-1064(level)X
-1249(increases.)X
-1613(In)X
-1709(fact,)X
-1879(\256gure)X
-2095(seven)X
-2307(reveals)X
-2564(that)X
-2713(we)X
-2836(are)X
-2964(able)X
-3127(to)X
-3218(overlap)X
-3487(CPU)X
-3670(and)X
-3814(disk)X
-3975(utilization)X
-555 3534(slightly)N
-825(producing)X
-1181(approximately)X
-1674(a)X
-1740(10%)X
-1917(performance)X
-2354(improvement)X
-2811(with)X
-2983(two)X
-3133(processes.)X
-3511(After)X
-3711(that)X
-3861(point,)X
-4075(perfor-)X
-555 3624(mance)N
-785(drops)X
-983(off,)X
-1117(and)X
-1253(at)X
-1331(a)X
-1387(multi-programming)X
-2038(level)X
-2214(of)X
-2301(4,)X
-2381(we)X
-2495(are)X
-2614(performing)X
-2995(worse)X
-3207(than)X
-3365(in)X
-3447(the)X
-3565(single)X
-3776(process)X
-4037(case.)X
-755 3747(Similar)N
-1021(behavior)X
-1333(was)X
-1489(reported)X
-1787(on)X
-1897(the)X
-2025(commercial)X
-2434(relational)X
-2767(database)X
-3074(system)X
-3326(using)X
-3529(the)X
-3657(same)X
-3852(con\256guration.)X
-555 3837(The)N
-707(important)X
-1045(conclusion)X
-1419(to)X
-1508(draw)X
-1696(from)X
-1879(this)X
-2021(is)X
-2101(that)X
-2248(you)X
-2395(cannot)X
-2636(attain)X
-2841(good)X
-3028(multi-user)X
-3384(scaling)X
-3638(on)X
-3745(a)X
-3808(badly)X
-4013(balanced)X
-555 3927(system.)N
-839(If)X
-915(multi-user)X
-1266(performance)X
-1695(on)X
-1797(applications)X
-2205(of)X
-2293(this)X
-2429(sort)X
-2570(is)X
-2644(important,)X
-2996(one)X
-3133(must)X
-3309(have)X
-3482(a)X
-3539(separate)X
-3824(logging)X
-4089(device)X
-555 4017(and)N
-697(horizontally)X
-1110(partition)X
-1407(the)X
-1531(database)X
-1834(to)X
-1921(allow)X
-2124(a)X
-2185(suf\256ciently)X
-2570(high)X
-2737(degree)X
-2977(of)X
-3069(multiprogramming)X
-3698(that)X
-3843(group)X
-4055(commit)X
-555 4107(can)N
-687(amortize)X
-988(the)X
-1106(cost)X
-1255(of)X
-1342(log)X
-1464(\257ushing.)X
-755 4230(By)N
-871(using)X
-1067(a)X
-1126(very)X
-1292(small)X
-1488(database)X
-1788(\(one)X
-1954(that)X
-2097(can)X
-2232(be)X
-2331(entirely)X
-2599(cached)X
-2846(in)X
-2930(main)X
-3112(memory\))X
-3428(and)X
-3566(read-only)X
-3896(transactions,)X
-555 4320(we)N
-670(generated)X
-1004(a)X
-1061(CPU)X
-1236(bound)X
-1456(environment.)X
-1921(By)X
-2034(using)X
-2227(the)X
-2345(same)X
-2530(small)X
-2723(database,)X
-3040(the)X
-3158(complete)X
-3472(TPCB)X
-3691(transaction,)X
-4083(and)X
-4219(no)X
-3 f
-555 4410(fsync)N
-1 f
-733(\(2\))X
-862(on)X
-977(the)X
-1110(log)X
-1247(at)X
-1340(commit,)X
-1639(we)X
-1768(created)X
-2036(a)X
-2107(lock)X
-2280(contention)X
-2652(bound)X
-2886(environment.)X
-3365(The)X
-3524(small)X
-3731(database)X
-4042(used)X
-4223(an)X
-555 4500(account)N
-828(\256le)X
-953(containing)X
-1314(only)X
-1479(1000)X
-1662(records)X
-1922(rather)X
-2133(than)X
-2294(the)X
-2415(full)X
-2549(1,000,000)X
-2891(records)X
-3150(and)X
-3288(ran)X
-3413(enough)X
-3671(transactions)X
-4076(to)X
-4160(read)X
-555 4590(the)N
-677(entire)X
-883(database)X
-1183(into)X
-1330(the)X
-1451(buffer)X
-1671(pool)X
-1836(\(2000\))X
-2073(before)X
-2302(beginning)X
-2645(measurements.)X
-3147(The)X
-3295(read-only)X
-3626(transaction)X
-4001(consisted)X
-555 4680(of)N
-646(three)X
-831(database)X
-1132(reads)X
-1326(\(from)X
-1533(the)X
-1655(1000)X
-1839(record)X
-2069(account)X
-2343(\256le,)X
-2489(the)X
-2611(100)X
-2754(record)X
-2983(teller)X
-3171(\256le,)X
-3316(and)X
-3455(the)X
-3576(10)X
-3679(record)X
-3908(branch)X
-4150(\256le\).)X
-555 4770(Since)N
-759(no)X
-865(data)X
-1025(were)X
-1208(modi\256ed)X
-1518(and)X
-1660(no)X
-1766(history)X
-2014(records)X
-2277(were)X
-2460(written,)X
-2733(no)X
-2839(log)X
-2966(records)X
-3228(were)X
-3410(written.)X
-3702(For)X
-3838(the)X
-3961(contention)X
-555 4860(bound)N
-780(con\256guration,)X
-1252(we)X
-1371(used)X
-1543(the)X
-1666(normal)X
-1918(TPCB)X
-2142(transaction)X
-2519(\(against)X
-2798(the)X
-2920(small)X
-3117(database\))X
-3445(and)X
-3585(disabled)X
-3876(the)X
-3998(log)X
-4124(\257ush.)X
-555 4950(Figure)N
-784(eight)X
-964(shows)X
-1184(both)X
-1346(of)X
-1433(these)X
-1618(results.)X
-755 5073(The)N
-902(read-only)X
-1231(test)X
-1363(indicates)X
-1669(that)X
-1810(we)X
-1925(barely)X
-2147(scale)X
-2329(at)X
-2408(all)X
-2509(in)X
-2592(the)X
-2711(CPU)X
-2887(bound)X
-3108(case.)X
-3308(The)X
-3454(explanation)X
-3849(for)X
-3964(that)X
-4105(is)X
-4179(that)X
-555 5163(even)N
-735(with)X
-905(a)X
-969(single)X
-1188(process,)X
-1477(we)X
-1599(are)X
-1726(able)X
-1888(to)X
-1978(drive)X
-2171(the)X
-2297(CPU)X
-2480(utilization)X
-2832(to)X
-2922(96%.)X
-3137(As)X
-3254(a)X
-3317(result,)X
-3542(that)X
-3689(gives)X
-3885(us)X
-3983(very)X
-4153(little)X
-555 5253(room)N
-753(for)X
-876(improvement,)X
-1352(and)X
-1497(it)X
-1570(takes)X
-1764(a)X
-1829(multiprogramming)X
-2462(level)X
-2647(of)X
-2743(four)X
-2906(to)X
-2997(approach)X
-3321(100%)X
-3537(CPU)X
-3721(saturation.)X
-4106(In)X
-4201(the)X
-555 5343(case)N
-718(where)X
-939(we)X
-1057(do)X
-1161(perform)X
-1444(writes,)X
-1684(we)X
-1802(are)X
-1925(interested)X
-2261(in)X
-2347(detecting)X
-2665(when)X
-2863(lock)X
-3025(contention)X
-3387(becomes)X
-3691(a)X
-3750(dominant)X
-4075(perfor-)X
-555 5433(mance)N
-787(factor.)X
-1037(Contention)X
-1414(will)X
-1560(cause)X
-1761(two)X
-1903(phenomena;)X
-2317(we)X
-2433(will)X
-2579(see)X
-2704(transactions)X
-3109(queueing)X
-3425(behind)X
-3665(frequently)X
-4017(accessed)X
-555 5523(data,)N
-731(and)X
-869(we)X
-985(will)X
-1131(see)X
-1256(transaction)X
-1629(abort)X
-1815(rates)X
-1988(increasing)X
-2339(due)X
-2476(to)X
-2559(deadlock.)X
-2910(Given)X
-3127(that)X
-3268(the)X
-3387(branch)X
-3627(\256le)X
-3750(contains)X
-4038(only)X
-4201(ten)X
-8 s
-10 f
-555 5595(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)N
-5 s
-1 f
-727 5673(4)N
-8 s
-763 5698(Although)N
-1021(the)X
-1115(log)X
-1213(is)X
-1272(written)X
-1469(sequentially,)X
-1810(we)X
-1900(do)X
-1980(not)X
-2078(get)X
-2172(the)X
-2266(bene\256t)X
-2456(of)X
-2525(sequentiality)X
-2868(since)X
-3015(the)X
-3109(log)X
-3207(and)X
-3315(database)X
-3550(reside)X
-3718(on)X
-3798(the)X
-3892(same)X
-4039(disk.)X
-
-13 p
-%%Page: 13 13
-8 s 8 xH 0 xS 1 f
-10 s
-3 f
-1 f
-3187 2051 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-3286 2028 MXY
-0 17 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-3384 1926 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-3483 1910 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-3581 1910 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-3680 1832 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-3778 1909 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-3877 1883 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-3975 1679 MXY
-0 17 Dl
-0 -8 Dl
-9 0 Dl
--18 0 Dl
-4074 1487 MXY
-0 17 Dl
-0 -8 Dl
-9 0 Dl
--18 0 Dl
-5 Dt
-3187 2060 MXY
-99 -24 Dl
-98 -101 Dl
-99 -16 Dl
-98 0 Dl
-99 -78 Dl
-98 77 Dl
-99 -26 Dl
-98 -204 Dl
-99 -192 Dl
-3 f
-6 s
-4088 1516(SMALL)N
-3 Dt
-3187 2051 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-3286 2051 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-3384 2041 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-3483 1990 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-3581 1843 MXY
-0 17 Dl
-0 -8 Dl
-9 0 Dl
--18 0 Dl
-3680 1578 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-3778 1496 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-3877 1430 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-3975 1269 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-4074 1070 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-1 Dt
-3187 2060 MXY
-99 0 Dl
-98 -10 Dl
-99 -51 Dl
-98 -147 Dl
-99 -265 Dl
-98 -82 Dl
-99 -66 Dl
-98 -161 Dl
-99 -199 Dl
-4088 1099(LARGE)N
-5 Dt
-3089 2060 MXY
-985 0 Dl
-3089 MX
-0 -1174 Dl
-4 Ds
-1 Dt
-3581 2060 MXY
-0 -1174 Dl
-4074 2060 MXY
-0 -1174 Dl
-3089 1825 MXY
-985 0 Dl
-9 s
-2993 1855(25)N
-3089 1591 MXY
-985 0 Dl
-2993 1621(50)N
-3089 1356 MXY
-985 0 Dl
-2993 1386(75)N
-3089 1121 MXY
-985 0 Dl
-2957 1151(100)N
-3089 886 MXY
-985 0 Dl
-2957 916(125)N
-3281 2199(Multiprogramming)N
-3071 2152(0)N
-3569(5)X
-4038(10)X
-2859 787(Aborts)N
-3089(per)X
-3211(500)X
-2901 847(transactions)N
--1 Ds
-3 Dt
-2037 1342 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-2125 1358 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-2213 1341 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-2301 1191 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-2388 1124 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--17 0 Dl
-2476 1157 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-2564 1157 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-2652 1161 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-2740 1153 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-2828 1150 MXY
-0 18 Dl
-0 -9 Dl
-8 0 Dl
--17 0 Dl
-5 Dt
-2037 1351 MXY
-88 16 Dl
-88 -17 Dl
-88 -150 Dl
-87 -67 Dl
-88 33 Dl
-88 0 Dl
-88 4 Dl
-88 -8 Dl
-88 -3 Dl
-6 s
-2685 1234(READ-ONLY)N
-3 Dt
-2037 1464 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-2125 1640 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-2213 1854 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-2301 1872 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-2388 1871 MXY
-0 17 Dl
-0 -9 Dl
-9 0 Dl
--17 0 Dl
-2476 1933 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-2564 1914 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-2652 1903 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-2740 1980 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-2828 2004 MXY
-0 18 Dl
-0 -9 Dl
-8 0 Dl
--17 0 Dl
-1 Dt
-2037 1473 MXY
-88 176 Dl
-88 214 Dl
-88 18 Dl
-87 -2 Dl
-88 63 Dl
-88 -19 Dl
-88 -11 Dl
-88 77 Dl
-88 24 Dl
-2759 1997(NO-FSYNC)N
-5 Dt
-1949 2060 MXY
-879 0 Dl
-1949 MX
-0 -1174 Dl
-4 Ds
-1 Dt
-2388 2060 MXY
-0 -1174 Dl
-2828 2060 MXY
-0 -1174 Dl
-1949 1825 MXY
-879 0 Dl
-9 s
-1842 1855(40)N
-1949 1591 MXY
-879 0 Dl
-1842 1621(80)N
-1949 1356 MXY
-879 0 Dl
-1806 1386(120)N
-1949 1121 MXY
-879 0 Dl
-1806 1151(160)N
-1949 886 MXY
-879 0 Dl
-1806 916(200)N
-2088 2199(Multiprogramming)N
-1844 863(in)N
-1922(TPS)X
-1761 792(Throughput)N
-1931 2121(0)N
-2370 2133(5)N
-2792(10)X
-6 s
-1679 1833(LIBTP)N
--1 Ds
-3 Dt
-837 1019 MXY
-0 17 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-929 878 MXY
-0 17 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-1021 939 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-1113 1043 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-1205 1314 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-1297 1567 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-1389 1665 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-1481 1699 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-1573 1828 MXY
-0 18 Dl
-0 -9 Dl
-9 0 Dl
--18 0 Dl
-1665 1804 MXY
-0 18 Dl
-0 -9 Dl
-8 0 Dl
--17 0 Dl
-5 Dt
-837 1027 MXY
-92 -141 Dl
-92 62 Dl
-92 104 Dl
-92 271 Dl
-92 253 Dl
-92 98 Dl
-92 34 Dl
-92 129 Dl
-92 -24 Dl
-745 2060 MXY
-920 0 Dl
-745 MX
-0 -1174 Dl
-4 Ds
-1 Dt
-1205 2060 MXY
-0 -1174 Dl
-1665 2060 MXY
-0 -1174 Dl
-745 1766 MXY
-920 0 Dl
-9 s
-673 1796(3)N
-745 1473 MXY
-920 0 Dl
-673 1503(5)N
-745 1180 MXY
-920 0 Dl
-673 1210(8)N
-745 886 MXY
-920 0 Dl
-637 916(10)N
-905 2199(Multiprogramming)N
-622 851(in)N
-700(TPS)X
-575 792(Throughput)N
-733 2152(0)N
-1196(5)X
-1629(10)X
-3 Dt
--1 Ds
-8 s
-655 2441(Figure)N
-872(7:)X
-960(Multi-user)X
-1286(Performance.)X
-1 f
-655 2531(Since)N
-825(the)X
-931(con\256guration)X
-1300(is)X
-1371(completely)X
-655 2621(disk)N
-790(bound,)X
-994(we)X
-1096(see)X
-1204(only)X
-1345(a)X
-1400(small)X
-1566(im-)X
-655 2711(provement)N
-964(by)X
-1064(adding)X
-1274(a)X
-1337(second)X
-1549(pro-)X
-655 2801(cess.)N
-849(Adding)X
-1081(any)X
-1213(more)X
-1383(concurrent)X
-655 2891(processes)N
-935(causes)X
-1137(performance)X
-1493(degra-)X
-655 2981(dation.)N
-3 f
-1927 2441(Figure)N
-2149(8:)X
-2243(Multi-user)X
-2574(Performance)X
-1927 2531(on)N
-2021(a)X
-2079(small)X
-2251(database.)X
-1 f
-2551(With)X
-2704(one)X
-2821(pro-)X
-1927 2621(cess,)N
-2075(we)X
-2174(are)X
-2276(driving)X
-2486(the)X
-2589(CPU)X
-2739(at)X
-2810(96%)X
-1927 2711(utilization)N
-2215(leaving)X
-2430(little)X
-2575(room)X
-2737(for)X
-2838(im-)X
-1927 2801(provement)N
-2238(as)X
-2328(the)X
-2443(multiprogramming)X
-1927 2891(level)N
-2091(increases.)X
-2396(In)X
-2489(the)X
-2607(NO-FSYNC)X
-1927 2981(case,)N
-2076(lock)X
-2209(contention)X
-2502(degrades)X
-2751(perfor-)X
-1927 3071(mance)N
-2117(as)X
-2194(soon)X
-2339(as)X
-2416(a)X
-2468(second)X
-2669(process)X
-2884(is)X
-1927 3161(added.)N
-3 f
-3199 2441(Figure)N
-3405(9:)X
-3482(Abort)X
-3669(rates)X
-3827(on)X
-3919(the)X
-4028(TPCB)X
-3199 2531(Benchmark.)N
-1 f
-3589(The)X
-3726(abort)X
-3895(rate)X
-4028(climbs)X
-3199 2621(more)N
-3366(quickly)X
-3594(for)X
-3704(the)X
-3818(large)X
-3980(database)X
-3199 2711(test)N
-3324(since)X
-3491(processes)X
-3771(are)X
-3884(descheduled)X
-3199 2801(more)N
-3409(frequently,)X
-3766(allowing)X
-4068(more)X
-3199 2891(processes)N
-3459(to)X
-3525(vie)X
-3619(for)X
-3709(the)X
-3803(same)X
-3950(locks.)X
-10 s
-10 f
-555 3284(h)N
-579(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)X
-1 f
-555 3560(records,)N
-835(we)X
-952(expect)X
-1185(contention)X
-1546(to)X
-1631(become)X
-1904(a)X
-1963(factor)X
-2174(quickly)X
-2437(and)X
-2576(the)X
-2697(NO-FSYNC)X
-3120(line)X
-3263(in)X
-3348(\256gure)X
-3557(eight)X
-3739(demonstrates)X
-4184(this)X
-555 3650(dramatically.)N
-1022(Each)X
-1209(additional)X
-1555(process)X
-1822(causes)X
-2058(both)X
-2226(more)X
-2417(waiting)X
-2682(and)X
-2823(more)X
-3013(deadlocking.)X
-3470(Figure)X
-3704(nine)X
-3867(shows)X
-4092(that)X
-4237(in)X
-555 3740(the)N
-681(small)X
-882(database)X
-1187(case)X
-1353(\(SMALL\),)X
-1725(waiting)X
-1992(is)X
-2072(the)X
-2197(dominant)X
-2526(cause)X
-2732(of)X
-2826(declining)X
-3151(performance)X
-3585(\(the)X
-3737(number)X
-4009(of)X
-4103(aborts)X
-555 3830(increases)N
-878(less)X
-1026(steeply)X
-1281(than)X
-1447(the)X
-1573(performance)X
-2008(drops)X
-2214(off)X
-2336(in)X
-2426(\256gure)X
-2641(eight\),)X
-2876(while)X
-3082(in)X
-3172(the)X
-3298(large)X
-3487(database)X
-3792(case)X
-3958(\(LARGE\),)X
-555 3920(deadlocking)N
-967(contributes)X
-1343(more)X
-1528(to)X
-1610(the)X
-1728(declining)X
-2046(performance.)X
-755 4043(Deadlocks)N
-1116(are)X
-1237(more)X
-1424(likely)X
-1628(to)X
-1712(occur)X
-1913(in)X
-1997(the)X
-2116(LARGE)X
-2404(test)X
-2536(than)X
-2695(in)X
-2778(the)X
-2897(SMALL)X
-3189(test)X
-3321(because)X
-3597(there)X
-3779(are)X
-3899(more)X
-4085(oppor-)X
-555 4133(tunities)N
-814(to)X
-900(wait.)X
-1082(In)X
-1173(the)X
-1295(SMALL)X
-1590(case,)X
-1773(processes)X
-2105(never)X
-2307(do)X
-2410(I/O)X
-2540(and)X
-2679(are)X
-2801(less)X
-2944(likely)X
-3149(to)X
-3234(be)X
-3333(descheduled)X
-3753(during)X
-3985(a)X
-4044(transac-)X
-555 4223(tion.)N
-740(In)X
-828(the)X
-947(LARGE)X
-1235(case,)X
-1415(processes)X
-1744(will)X
-1889(frequently)X
-2240(be)X
-2337(descheduled)X
-2755(since)X
-2941(they)X
-3100(have)X
-3273(to)X
-3356(perform)X
-3636(I/O.)X
-3804(This)X
-3967(provides)X
-4263(a)X
-555 4313(window)N
-837(where)X
-1058(a)X
-1118(second)X
-1365(process)X
-1630(can)X
-1766(request)X
-2022(locks)X
-2215(on)X
-2318(already)X
-2578(locked)X
-2815(pages,)X
-3041(thus)X
-3197(increasing)X
-3550(the)X
-3671(likelihood)X
-4018(of)X
-4108(build-)X
-555 4403(ing)N
-677(up)X
-777(long)X
-939(chains)X
-1164(of)X
-1251(waiting)X
-1511(processes.)X
-1879(Eventually,)X
-2266(this)X
-2401(leads)X
-2586(to)X
-2668(deadlock.)X
-3 f
-555 4589(5.2.)N
-715(The)X
-868(OO1)X
-1052(Benchmark)X
-1 f
-755 4712(The)N
-903(TPCB)X
-1125(benchmark)X
-1505(described)X
-1836(in)X
-1921(the)X
-2042(previous)X
-2341(section)X
-2591(measures)X
-2913(performance)X
-3343(under)X
-3549(a)X
-3608(conventional)X
-4044(transac-)X
-555 4802(tion)N
-706(processing)X
-1076(workload.)X
-1446(Other)X
-1656(application)X
-2039(domains,)X
-2357(such)X
-2531(as)X
-2625(computer-aided)X
-3156(design,)X
-3412(have)X
-3591(substantially)X
-4022(different)X
-555 4892(access)N
-786(patterns.)X
-1105(In)X
-1197(order)X
-1392(to)X
-1479(measure)X
-1772(the)X
-1895(performance)X
-2327(of)X
-2418(LIBTP)X
-2664(under)X
-2871(workloads)X
-3229(of)X
-3320(this)X
-3459(type,)X
-3641(we)X
-3759(implemented)X
-4201(the)X
-555 4982(OO1)N
-731(benchmark)X
-1108(described)X
-1436(in)X
-1518([CATT91].)X
-755 5105(The)N
-908(database)X
-1213(models)X
-1472(a)X
-1535(set)X
-1651(of)X
-1745(electronics)X
-2120(components)X
-2534(with)X
-2703(connections)X
-3113(among)X
-3358(them.)X
-3585(One)X
-3746(table)X
-3929(stores)X
-4143(parts)X
-555 5195(and)N
-696(another)X
-962(stores)X
-1174(connections.)X
-1622(There)X
-1835(are)X
-1959(three)X
-2145(connections)X
-2552(originating)X
-2927(at)X
-3009(any)X
-3149(given)X
-3351(part.)X
-3540(Ninety)X
-3782(percent)X
-4043(of)X
-4134(these)X
-555 5285(connections)N
-960(are)X
-1081(to)X
-1165(nearby)X
-1406(parts)X
-1584(\(those)X
-1802(with)X
-1966(nearby)X
-2 f
-2207(ids)X
-1 f
-2300(\))X
-2348(to)X
-2431(model)X
-2652(the)X
-2771(spatial)X
-3001(locality)X
-3262(often)X
-3448(exhibited)X
-3767(in)X
-3850(CAD)X
-4040(applica-)X
-555 5375(tions.)N
-779(Ten)X
-933(percent)X
-1198(of)X
-1293(the)X
-1419(connections)X
-1830(are)X
-1957(randomly)X
-2292(distributed)X
-2662(among)X
-2908(all)X
-3016(other)X
-3209(parts)X
-3393(in)X
-3483(the)X
-3609(database.)X
-3954(Every)X
-4174(part)X
-555 5465(appears)N
-829(exactly)X
-1089(three)X
-1278(times)X
-1479(in)X
-1569(the)X
-2 f
-1695(from)X
-1 f
-1874(\256eld)X
-2043(of)X
-2137(a)X
-2200(connection)X
-2579(record,)X
-2832(and)X
-2975(zero)X
-3141(or)X
-3235(more)X
-3427(times)X
-3627(in)X
-3716(the)X
-2 f
-3841(to)X
-1 f
-3930(\256eld.)X
-4139(Parts)X
-555 5555(have)N
-2 f
-727(x)X
-1 f
-783(and)X
-2 f
-919(y)X
-1 f
-975(locations)X
-1284(set)X
-1393(randomly)X
-1720(in)X
-1802(an)X
-1898(appropriate)X
-2284(range.)X
-
-14 p
-%%Page: 14 14
-10 s 10 xH 0 xS 1 f
-3 f
-1 f
-755 630(The)N
-900(intent)X
-1102(of)X
-1189(OO1)X
-1365(is)X
-1438(to)X
-1520(measure)X
-1808(the)X
-1926(overall)X
-2169(cost)X
-2318(of)X
-2405(a)X
-2461(query)X
-2664(mix)X
-2808(characteristic)X
-3257(of)X
-3344(engineering)X
-3743(database)X
-4040(applica-)X
-555 720(tions.)N
-770(There)X
-978(are)X
-1097(three)X
-1278(tests:)X
-10 f
-635 843(g)N
-2 f
-755(Lookup)X
-1 f
-1022(generates)X
-1353(1,000)X
-1560(random)X
-1832(part)X
-2 f
-1984(ids)X
-1 f
-2077(,)X
-2124(fetches)X
-2378(the)X
-2502(corresponding)X
-2987(parts)X
-3169(from)X
-3351(the)X
-3475(database,)X
-3798(and)X
-3940(calls)X
-4113(a)X
-4175(null)X
-755 933(procedure)N
-1097(in)X
-1179(the)X
-1297(host)X
-1450(programming)X
-1906(language)X
-2216(with)X
-2378(the)X
-2496(parts')X
-2 f
-2699(x)X
-1 f
-2755(and)X
-2 f
-2891(y)X
-1 f
-2947(positions.)X
-10 f
-635 1056(g)N
-2 f
-755(Traverse)X
-1 f
-1067(retrieves)X
-1371(a)X
-1434(random)X
-1706(part)X
-1858(from)X
-2041(the)X
-2166(database)X
-2470(and)X
-2613(follows)X
-2880(connections)X
-3290(from)X
-3473(it)X
-3544(to)X
-3632(other)X
-3823(parts.)X
-4045(Each)X
-4232(of)X
-755 1146(those)N
-947(parts)X
-1126(is)X
-1202(retrieved,)X
-1531(and)X
-1670(all)X
-1773(connections)X
-2179(from)X
-2358(it)X
-2424(followed.)X
-2771(This)X
-2935(procedure)X
-3279(is)X
-3354(repeated)X
-3649(depth-\256rst)X
-4000(for)X
-4116(seven)X
-755 1236(hops)N
-930(from)X
-1110(the)X
-1232(original)X
-1505(part,)X
-1674(for)X
-1792(a)X
-1852(total)X
-2018(of)X
-2109(3280)X
-2293(parts.)X
-2513(Backward)X
-2862(traversal)X
-3162(also)X
-3314(exists,)X
-3539(and)X
-3678(follows)X
-3941(all)X
-4044(connec-)X
-755 1326(tions)N
-930(into)X
-1074(a)X
-1130(given)X
-1328(part)X
-1473(to)X
-1555(their)X
-1722(origin.)X
-10 f
-635 1449(g)N
-2 f
-755(Insert)X
-1 f
-962(adds)X
-1129(100)X
-1269(new)X
-1423(parts)X
-1599(and)X
-1735(their)X
-1902(connections.)X
-755 1572(The)N
-913(benchmark)X
-1303(is)X
-1389(single-user,)X
-1794(but)X
-1929(multi-user)X
-2291(access)X
-2530(controls)X
-2821(\(locking)X
-3120(and)X
-3268(transaction)X
-3652(protection\))X
-4036(must)X
-4223(be)X
-555 1662(enforced.)N
-898(It)X
-968(is)X
-1042(designed)X
-1348(to)X
-1431(be)X
-1528(run)X
-1656(on)X
-1757(a)X
-1814(database)X
-2112(with)X
-2275(20,000)X
-2516(parts,)X
-2713(and)X
-2850(on)X
-2951(one)X
-3087(with)X
-3249(200,000)X
-3529(parts.)X
-3745(Because)X
-4033(we)X
-4147(have)X
-555 1752(insuf\256cient)N
-935(disk)X
-1088(space)X
-1287(for)X
-1401(the)X
-1519(larger)X
-1727(database,)X
-2044(we)X
-2158(report)X
-2370(results)X
-2599(only)X
-2761(for)X
-2875(the)X
-2993(20,000)X
-3233(part)X
-3378(database.)X
-3 f
-555 1938(5.2.1.)N
-775(Implementation)X
-1 f
-755 2061(The)N
-920(LIBTP)X
-1182(implementation)X
-1724(of)X
-1831(OO1)X
-2027(uses)X
-2205(the)X
-2342(TCL)X
-2532([OUST90])X
-2914(interface)X
-3235(described)X
-3582(earlier.)X
-3867(The)X
-4031(backend)X
-555 2151(accepts)N
-813(commands)X
-1181(over)X
-1345(an)X
-1442(IP)X
-1534(socket)X
-1760(and)X
-1897(performs)X
-2208(the)X
-2327(requested)X
-2656(database)X
-2954(actions.)X
-3242(The)X
-3387(frontend)X
-3679(opens)X
-3886(and)X
-4022(executes)X
-555 2241(a)N
-618(TCL)X
-796(script.)X
-1041(This)X
-1210(script)X
-1415(contains)X
-1709(database)X
-2013(accesses)X
-2313(interleaved)X
-2697(with)X
-2866(ordinary)X
-3165(program)X
-3463(control)X
-3716(statements.)X
-4120(Data-)X
-555 2331(base)N
-718(commands)X
-1085(are)X
-1204(submitted)X
-1539(to)X
-1621(the)X
-1739(backend)X
-2027(and)X
-2163(results)X
-2392(are)X
-2511(bound)X
-2731(to)X
-2813(program)X
-3105(variables.)X
-755 2454(The)N
-903(parts)X
-1082(table)X
-1261(was)X
-1409(stored)X
-1628(as)X
-1718(a)X
-1776(B-tree)X
-1999(indexed)X
-2275(by)X
-2 f
-2377(id)X
-1 f
-2439(.)X
-2501(The)X
-2648(connection)X
-3022(table)X
-3200(was)X
-3347(stored)X
-3565(as)X
-3654(a)X
-3712(set)X
-3823(of)X
-3912(\256xed-length)X
-555 2544(records)N
-824(using)X
-1029(the)X
-1159(4.4BSD)X
-1446(recno)X
-1657(access)X
-1895(method.)X
-2207(In)X
-2306(addition,)X
-2620(two)X
-2771(B-tree)X
-3003(indices)X
-3261(were)X
-3449(maintained)X
-3836(on)X
-3947(connection)X
-555 2634(table)N
-732(entries.)X
-1007(One)X
-1162(index)X
-1360(mapped)X
-1634(the)X
-2 f
-1752(from)X
-1 f
-1923(\256eld)X
-2085(to)X
-2167(a)X
-2223(connection)X
-2595(record)X
-2821(number,)X
-3106(and)X
-3242(the)X
-3360(other)X
-3545(mapped)X
-3819(the)X
-2 f
-3937(to)X
-1 f
-4019(\256eld)X
-4181(to)X
-4263(a)X
-555 2724(connection)N
-932(record)X
-1163(number.)X
-1473(These)X
-1690(indices)X
-1941(support)X
-2205(fast)X
-2345(lookups)X
-2622(on)X
-2726(connections)X
-3133(in)X
-3219(both)X
-3385(directions.)X
-3765(For)X
-3900(the)X
-4022(traversal)X
-555 2814(tests,)N
-743(the)X
-867(frontend)X
-1165(does)X
-1338(an)X
-1439(index)X
-1642(lookup)X
-1889(to)X
-1976(discover)X
-2273(the)X
-2396(connected)X
-2747(part's)X
-2 f
-2955(id)X
-1 f
-3017(,)X
-3062(and)X
-3203(then)X
-3366(does)X
-3538(another)X
-3804(lookup)X
-4051(to)X
-4138(fetch)X
-555 2904(the)N
-673(part)X
-818(itself.)X
-3 f
-555 3090(5.2.2.)N
-775(Performance)X
-1242(Measurements)X
-1766(for)X
-1889(OO1)X
-1 f
-755 3213(We)N
-888(compare)X
-1186(LIBTP's)X
-1487(OO1)X
-1664(performance)X
-2092(to)X
-2174(that)X
-2314(reported)X
-2602(in)X
-2684([CATT91].)X
-3087(Those)X
-3303(results)X
-3532(were)X
-3709(collected)X
-4019(on)X
-4119(a)X
-4175(Sun)X
-555 3303(3/280)N
-759(\(25)X
-888(MHz)X
-1075(MC68020\))X
-1448(with)X
-1612(16)X
-1714(MBytes)X
-1989(of)X
-2078(memory)X
-2367(and)X
-2505(two)X
-2647(Hitachi)X
-2904(892MByte)X
-3267(disks)X
-3452(\(15)X
-3580(ms)X
-3694(average)X
-3966(seek)X
-4130(time\))X
-555 3393(behind)N
-793(an)X
-889(SMD-4)X
-1149(controller.)X
-1521(Frontends)X
-1861(ran)X
-1984(on)X
-2084(an)X
-2180(8MByte)X
-2462(Sun)X
-2606(3/260.)X
-755 3516(In)N
-844(order)X
-1036(to)X
-1120(measure)X
-1410(performance)X
-1839(on)X
-1941(a)X
-1999(machine)X
-2293(of)X
-2382(roughly)X
-2653(equivalent)X
-3009(processor)X
-3339(power,)X
-3582(we)X
-3698(ran)X
-3822(one)X
-3959(set)X
-4069(of)X
-4157(tests)X
-555 3606(on)N
-666(a)X
-733(standalone)X
-1107(MC68030-based)X
-1671(HP300)X
-1923(\(33MHz)X
-2225(MC68030\).)X
-2646(The)X
-2801(database)X
-3108(was)X
-3263(stored)X
-3489(on)X
-3599(a)X
-3665(300MByte)X
-4037(HP7959)X
-555 3696(SCSI)N
-744(disk)X
-898(\(17)X
-1026(ms)X
-1139(average)X
-1410(seek)X
-1573(time\).)X
-1802(Since)X
-2000(this)X
-2135(machine)X
-2427(is)X
-2500(not)X
-2622(connected)X
-2968(to)X
-3050(a)X
-3106(network,)X
-3409(we)X
-3523(ran)X
-3646(local)X
-3822(tests)X
-3984(where)X
-4201(the)X
-555 3786(frontend)N
-855(and)X
-999(backend)X
-1295(run)X
-1430(on)X
-1538(the)X
-1664(same)X
-1856(machine.)X
-2195(We)X
-2334(compare)X
-2638(these)X
-2830(measurements)X
-3316(with)X
-3485(Cattell's)X
-3783(local)X
-3966(Sun)X
-4117(3/280)X
-555 3876(numbers.)N
-755 3999(Because)N
-1051(the)X
-1177(benchmark)X
-1562(requires)X
-1849(remote)X
-2100(access,)X
-2354(we)X
-2476(ran)X
-2607(another)X
-2876(set)X
-2993(of)X
-3088(tests)X
-3258(on)X
-3365(a)X
-3428(DECstation)X
-3828(5000/200)X
-4157(with)X
-555 4089(32M)N
-732(of)X
-825(memory)X
-1118(running)X
-1393(Ultrix)X
-1610(V4.0)X
-1794(and)X
-1936(a)X
-1998(DEC)X
-2184(1GByte)X
-2459(RZ57)X
-2666(SCSI)X
-2859(disk.)X
-3057(We)X
-3194(compare)X
-3496(the)X
-3619(local)X
-3800(performance)X
-4232(of)X
-555 4179(OO1)N
-734(on)X
-837(the)X
-958(DECstation)X
-1354(to)X
-1439(its)X
-1536(remote)X
-1781(performance.)X
-2250(For)X
-2383(the)X
-2503(remote)X
-2748(case,)X
-2929(we)X
-3045(ran)X
-3170(the)X
-3290(frontend)X
-3584(on)X
-3686(a)X
-3744(DECstation)X
-4139(3100)X
-555 4269(with)N
-717(16)X
-817(MBytes)X
-1090(of)X
-1177(main)X
-1357(memory.)X
-755 4392(The)N
-900(databases)X
-1228(tested)X
-1435(in)X
-1517([CATT91])X
-1880(are)X
-10 f
-635 4515(g)N
-1 f
-755(INDEX,)X
-1045(a)X
-1101(highly-optimized)X
-1672(access)X
-1898(method)X
-2158(package)X
-2442(developed)X
-2792(at)X
-2870(Sun)X
-3014(Microsystems.)X
-10 f
-635 4638(g)N
-1 f
-755(OODBMS,)X
-1137(a)X
-1193(beta)X
-1347(release)X
-1591(of)X
-1678(a)X
-1734(commercial)X
-2133(object-oriented)X
-2639(database)X
-2936(management)X
-3366(system.)X
-10 f
-635 4761(g)N
-1 f
-755(RDBMS,)X
-1076(a)X
-1133(UNIX-based)X
-1565(commercial)X
-1965(relational)X
-2289(data)X
-2444(manager)X
-2742(at)X
-2821(production)X
-3189(release.)X
-3474(The)X
-3620(OO1)X
-3797(implementation)X
-755 4851(used)N
-922(embedded)X
-1272(SQL)X
-1443(in)X
-1525(C.)X
-1638(Stored)X
-1867(procedures)X
-2240(were)X
-2417(de\256ned)X
-2673(to)X
-2755(reduce)X
-2990(client-server)X
-3412(traf\256c.)X
-755 4974(Table)N
-974(two)X
-1130(shows)X
-1366(the)X
-1500(measurements)X
-1995(from)X
-2187([CATT91])X
-2566(and)X
-2718(LIBTP)X
-2976(for)X
-3106(a)X
-3178(local)X
-3370(test)X
-3517(on)X
-3632(the)X
-3765(MC680x0-based)X
-555 5064(hardware.)N
-915(All)X
-1037(caches)X
-1272(are)X
-1391(cleared)X
-1644(before)X
-1870(each)X
-2038(test.)X
-2209(All)X
-2331(times)X
-2524(are)X
-2643(in)X
-2725(seconds.)X
-755 5187(Table)N
-960(two)X
-1102(shows)X
-1324(that)X
-1466(LIBTP)X
-1710(outperforms)X
-2123(the)X
-2242(commercial)X
-2642(relational)X
-2966(system,)X
-3229(but)X
-3352(is)X
-3426(slower)X
-3661(than)X
-3820(OODBMS)X
-4183(and)X
-555 5277(INDEX.)N
-872(Since)X
-1077(the)X
-1202(caches)X
-1444(were)X
-1628(cleared)X
-1888(at)X
-1973(the)X
-2098(start)X
-2263(of)X
-2356(each)X
-2530(test,)X
-2687(disk)X
-2846(throughput)X
-3223(is)X
-3302(critical)X
-3551(in)X
-3639(this)X
-3780(test.)X
-3957(The)X
-4108(single)X
-555 5367(SCSI)N
-749(HP)X
-877(drive)X
-1068(used)X
-1241(by)X
-1347(LIBTP)X
-1595(is)X
-1674(approximately)X
-2163(13%)X
-2336(slower)X
-2576(than)X
-2739(the)X
-2862(disks)X
-3051(used)X
-3223(in)X
-3310([CATT91])X
-3678(which)X
-3899(accounts)X
-4205(for)X
-555 5457(part)N
-700(of)X
-787(the)X
-905(difference.)X
-755 5580(OODBMS)N
-1118(and)X
-1255(INDEX)X
-1525(outperform)X
-1906(LIBTP)X
-2148(most)X
-2323(dramatically)X
-2744(on)X
-2844(traversal.)X
-3181(This)X
-3343(is)X
-3416(because)X
-3691(we)X
-3805(use)X
-3932(index)X
-4130(look-)X
-555 5670(ups)N
-689(to)X
-774(\256nd)X
-921(connections,)X
-1347(whereas)X
-1634(the)X
-1755(other)X
-1942(two)X
-2084(systems)X
-2359(use)X
-2488(a)X
-2546(link)X
-2692(access)X
-2920(method.)X
-3222(The)X
-3369(index)X
-3569(requires)X
-3850(us)X
-3943(to)X
-4027(examine)X
-
-15 p
-%%Page: 15 15
-10 s 10 xH 0 xS 1 f
-3 f
-1 f
-10 f
-555 679(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)N
-2 f
-606 769(Measure)N
-1 f
-1019(INDEX)X
-1389(OODBMS)X
-1851(RDBMS)X
-2250(LIBTP)X
-10 f
-555 771(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)N
-555 787(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)N
-1 f
-595 869(Lookup)N
-1114(5.4)X
-1490(12.9)X
-1950(27)X
-2291(27.2)X
-595 959(Traversal)N
-1074(13)X
-1530(9.8)X
-1950(90)X
-2291(47.3)X
-595 1049(Insert)N
-1114(7.4)X
-1530(1.5)X
-1950(22)X
-2331(9.7)X
-10 f
-555 1059(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)N
-555(c)X
-999(c)Y
-919(c)Y
-839(c)Y
-759(c)Y
-959 1059(c)N
-999(c)Y
-919(c)Y
-839(c)Y
-759(c)Y
-1329 1059(c)N
-999(c)Y
-919(c)Y
-839(c)Y
-759(c)Y
-1791 1059(c)N
-999(c)Y
-919(c)Y
-839(c)Y
-759(c)Y
-2190 1059(c)N
-999(c)Y
-919(c)Y
-839(c)Y
-759(c)Y
-2512 1059(c)N
-999(c)Y
-919(c)Y
-839(c)Y
-759(c)Y
-2618 679(i)N
-2629(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-2 f
-2829 769(Measure)N
-3401(Cache)X
-3726(Local)X
-4028(Remote)X
-1 f
-10 f
-2618 771(i)N
-2629(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-2618 787(i)N
-2629(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-2658 869(Lookup)N
-3401(cold)X
-3747(15.7)X
-4078(20.6)X
-3401 959(warm)N
-3787(7.8)X
-4078(12.4)X
-10 f
-2618 969(i)N
-2629(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-2658 1059(Forward)N
-2950(traversal)X
-3401(cold)X
-3747(28.4)X
-4078(52.6)X
-3401 1149(warm)N
-3747(23.5)X
-4078(47.4)X
-10 f
-2618 1159(i)N
-2629(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-2658 1249(Backward)N
-3004(traversal)X
-3401(cold)X
-3747(24.2)X
-4078(47.4)X
-3401 1339(warm)N
-3747(24.3)X
-4078(47.6)X
-10 f
-2618 1349(i)N
-2629(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-1 f
-2658 1439(Insert)N
-3401(cold)X
-3787(7.5)X
-4078(10.3)X
-3401 1529(warm)N
-3787(6.7)X
-4078(10.9)X
-10 f
-2618 1539(i)N
-2629(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)X
-2618(c)X
-1479(c)Y
-1399(c)Y
-1319(c)Y
-1239(c)Y
-1159(c)Y
-1079(c)Y
-999(c)Y
-919(c)Y
-839(c)Y
-759(c)Y
-3341 1539(c)N
-1479(c)Y
-1399(c)Y
-1319(c)Y
-1239(c)Y
-1159(c)Y
-1079(c)Y
-999(c)Y
-919(c)Y
-839(c)Y
-759(c)Y
-3666 1539(c)N
-1479(c)Y
-1399(c)Y
-1319(c)Y
-1239(c)Y
-1159(c)Y
-1079(c)Y
-999(c)Y
-919(c)Y
-839(c)Y
-759(c)Y
-3968 1539(c)N
-1479(c)Y
-1399(c)Y
-1319(c)Y
-1239(c)Y
-1159(c)Y
-1079(c)Y
-999(c)Y
-919(c)Y
-839(c)Y
-759(c)Y
-4309 1539(c)N
-1479(c)Y
-1399(c)Y
-1319(c)Y
-1239(c)Y
-1159(c)Y
-1079(c)Y
-999(c)Y
-919(c)Y
-839(c)Y
-759(c)Y
-3 f
-587 1785(Table)N
-823(2:)X
-931(Local)X
-1163(MC680x0)X
-1538(Performance)X
-2026(of)X
-2133(Several)X
-587 1875(Systems)N
-883(on)X
-987(OO1.)X
-2667 1785(Table)N
-2909(3:)X
-3023(Local)X
-3260(vs.)X
-3397(Remote)X
-3707(Performance)X
-4200(of)X
-2667 1875(LIBTP)N
-2926(on)X
-3030(OO1.)X
-1 f
-10 f
-555 1998(h)N
-579(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)X
-1 f
-555 2274(two)N
-696(disk)X
-850(pages,)X
-1074(but)X
-1197(the)X
-1316(links)X
-1492(require)X
-1741(only)X
-1904(one,)X
-2061(regardless)X
-2408(of)X
-2496(database)X
-2794(size.)X
-2980(Cattell)X
-3214(reports)X
-3458(that)X
-3599(lookups)X
-3873(using)X
-4067(B-trees)X
-555 2364(instead)N
-808(of)X
-901(links)X
-1082(makes)X
-1313(traversal)X
-1616(take)X
-1776(twice)X
-1976(as)X
-2069(long)X
-2237(in)X
-2325(INDEX.)X
-2641(Adding)X
-2907(a)X
-2969(link)X
-3119(access)X
-3351(method)X
-3617(to)X
-3 f
-3704(db)X
-1 f
-3792(\(3\))X
-3911(or)X
-4003(using)X
-4201(the)X
-555 2454(existing)N
-828(hash)X
-995(method)X
-1255(would)X
-1475(apparently)X
-1834(be)X
-1930(a)X
-1986(good)X
-2166(idea.)X
-755 2577(Both)N
-936(OODBMS)X
-1304(and)X
-1446(INDEX)X
-1722(issue)X
-1908 0.1944(coarser-granularity)AX
-2545(locks)X
-2739(than)X
-2902(LIBTP.)X
-3189(This)X
-3356(limits)X
-3562(concurrency)X
-3985(for)X
-4104(multi-)X
-555 2667(user)N
-711(applications,)X
-1140(but)X
-1264(helps)X
-1455(single-user)X
-1829(applications.)X
-2278(In)X
-2367(addition,)X
-2671(the)X
-2791(fact)X
-2934(that)X
-3076(LIBTP)X
-3319(releases)X
-3595(B-tree)X
-3817(locks)X
-4007(early)X
-4189(is)X
-4263(a)X
-555 2757(drawback)N
-896(in)X
-986(OO1.)X
-1210(Since)X
-1416(there)X
-1605(is)X
-1686(no)X
-1793(concurrency)X
-2218(in)X
-2307(the)X
-2432(benchmark,)X
-2836(high-concurrency)X
-3430(strategies)X
-3760(only)X
-3929(show)X
-4125(up)X
-4232(as)X
-555 2847(increased)N
-882(locking)X
-1145(overhead.)X
-1503(Finally,)X
-1772(the)X
-1892(architecture)X
-2294(of)X
-2383(the)X
-2503(LIBTP)X
-2747(implementation)X
-3271(was)X
-3418(substantially)X
-3844(different)X
-4143(from)X
-555 2937(that)N
-702(of)X
-796(either)X
-1006(OODBMS)X
-1375(or)X
-1469(INDEX.)X
-1786(Both)X
-1968(of)X
-2062(those)X
-2258(systems)X
-2538(do)X
-2645(the)X
-2770(searches)X
-3070(in)X
-3159(the)X
-3284(user's)X
-3503(address)X
-3771(space,)X
-3997(and)X
-4139(issue)X
-555 3027(requests)N
-844(for)X
-964(pages)X
-1173(to)X
-1260(the)X
-1383(server)X
-1605(process.)X
-1911(Pages)X
-2123(are)X
-2247(cached)X
-2496(in)X
-2583(the)X
-2706(client,)X
-2929(and)X
-3070(many)X
-3273(queries)X
-3530(can)X
-3667(be)X
-3768(satis\256ed)X
-4055(without)X
-555 3117(contacting)N
-910(the)X
-1029(server)X
-1247(at)X
-1326(all.)X
-1467(LIBTP)X
-1710(submits)X
-1979(all)X
-2080(the)X
-2199(queries)X
-2452(to)X
-2535(the)X
-2653(server)X
-2870(process,)X
-3151(and)X
-3287(receives)X
-3571(database)X
-3868(records)X
-4125(back;)X
-555 3207(it)N
-619(does)X
-786(no)X
-886(client)X
-1084(caching.)X
-755 3330(The)N
-911(RDBMS)X
-1221(architecture)X
-1632(is)X
-1716(much)X
-1925(closer)X
-2148(to)X
-2241(that)X
-2392(of)X
-2490(LIBTP.)X
-2783(A)X
-2872(server)X
-3100(process)X
-3372(receives)X
-3667(queries)X
-3930(and)X
-4076(returns)X
-555 3420(results)N
-786(to)X
-870(a)X
-928(client.)X
-1168(The)X
-1315(timing)X
-1545(results)X
-1776(in)X
-1860(table)X
-2038(two)X
-2180(clearly)X
-2421(show)X
-2612(that)X
-2754(the)X
-2874(conventional)X
-3309(database)X
-3607(client/server)X
-4025(model)X
-4246(is)X
-555 3510(expensive.)N
-941(LIBTP)X
-1188(outperforms)X
-1605(the)X
-1728(RDBMS)X
-2032(on)X
-2136(traversal)X
-2437(and)X
-2577(insertion.)X
-2921(We)X
-3057(speculate)X
-3380(that)X
-3524(this)X
-3663(is)X
-3740(due)X
-3880(in)X
-3966(part)X
-4115(to)X
-4201(the)X
-555 3600(overhead)N
-870(of)X
-957(query)X
-1160(parsing,)X
-1436(optimization,)X
-1880(and)X
-2016(repeated)X
-2309(interpretation)X
-2761(of)X
-2848(the)X
-2966(plan)X
-3124(tree)X
-3265(in)X
-3347(the)X
-3465(RDBMS')X
-3791(query)X
-3994(executor.)X
-755 3723(Table)N
-962(three)X
-1147(shows)X
-1371(the)X
-1492(differences)X
-1873(between)X
-2164(local)X
-2343(and)X
-2482(remote)X
-2728(execution)X
-3063(of)X
-3153(LIBTP's)X
-3456(OO1)X
-3635(implementation)X
-4160(on)X
-4263(a)X
-555 3813(DECstation.)N
-989(We)X
-1122(measured)X
-1451(performance)X
-1879(with)X
-2042(a)X
-2099(populated)X
-2436(\(warm\))X
-2694(cache)X
-2899(and)X
-3036(an)X
-3133(empty)X
-3354(\(cold\))X
-3567(cache.)X
-3812(Reported)X
-4126(times)X
-555 3903(are)N
-681(the)X
-806(means)X
-1037(of)X
-1130(twenty)X
-1374(tests,)X
-1562(and)X
-1704(are)X
-1829(in)X
-1917(seconds.)X
-2237(Standard)X
-2548(deviations)X
-2903(were)X
-3086(within)X
-3316(seven)X
-3525(percent)X
-3788(of)X
-3881(the)X
-4005(mean)X
-4205(for)X
-555 3993(remote,)N
-818(and)X
-954(two)X
-1094(percent)X
-1351(of)X
-1438(the)X
-1556(mean)X
-1750(for)X
-1864(local.)X
-755 4116(The)N
-914(20ms)X
-1121(overhead)X
-1450(of)X
-1551(TCP/IP)X
-1824(on)X
-1938(an)X
-2048(Ethernet)X
-2354(entirely)X
-2633(accounts)X
-2948(for)X
-3076(the)X
-3207(difference)X
-3567(in)X
-3662(speed.)X
-3918(The)X
-4076(remote)X
-555 4206(traversal)N
-857(times)X
-1055(are)X
-1179(nearly)X
-1405(double)X
-1648(the)X
-1771(local)X
-1952(times)X
-2150(because)X
-2430(we)X
-2549(do)X
-2653(index)X
-2855(lookups)X
-3132(and)X
-3272(part)X
-3421(fetches)X
-3673(in)X
-3759(separate)X
-4047(queries.)X
-555 4296(It)N
-629(would)X
-854(make)X
-1053(sense)X
-1252(to)X
-1339(do)X
-1444(indexed)X
-1723(searches)X
-2021(on)X
-2126(the)X
-2248(server,)X
-2489(but)X
-2615(we)X
-2733(were)X
-2914(unwilling)X
-3244(to)X
-3330(hard-code)X
-3676(knowledge)X
-4052(of)X
-4143(OO1)X
-555 4386(indices)N
-803(into)X
-948(our)X
-1075(LIBTP)X
-1317(TCL)X
-1488(server.)X
-1745(Cold)X
-1920(and)X
-2056(warm)X
-2259(insertion)X
-2559(times)X
-2752(are)X
-2871(identical)X
-3167(since)X
-3352(insertions)X
-3683(do)X
-3783(not)X
-3905(bene\256t)X
-4143(from)X
-555 4476(caching.)N
-755 4599(One)N
-915(interesting)X
-1279(difference)X
-1632(shown)X
-1867(by)X
-1973(table)X
-2155(three)X
-2342(is)X
-2421(the)X
-2545(cost)X
-2700(of)X
-2793(forward)X
-3074(versus)X
-3305(backward)X
-3644(traversal.)X
-3987(When)X
-4205(we)X
-555 4689(built)N
-725(the)X
-847(database,)X
-1168(we)X
-1285(inserted)X
-1562(parts)X
-1741(in)X
-1826(part)X
-2 f
-1974(id)X
-1 f
-2059(order.)X
-2292(We)X
-2427(built)X
-2596(the)X
-2717(indices)X
-2967(at)X
-3048(the)X
-3169(same)X
-3357(time.)X
-3562(Therefore,)X
-3923(the)X
-4044(forward)X
-555 4779(index)N
-757(had)X
-897(keys)X
-1068(inserted)X
-1346(in)X
-1432(order,)X
-1646(while)X
-1848(the)X
-1970(backward)X
-2307(index)X
-2509(had)X
-2649(keys)X
-2820(inserted)X
-3098(more)X
-3286(randomly.)X
-3656(In-order)X
-3943(insertion)X
-4246(is)X
-555 4885(pessimal)N
-858(for)X
-975(B-tree)X
-1199(indices,)X
-1469(so)X
-1563(the)X
-1684(forward)X
-1962(index)X
-2163(is)X
-2239(much)X
-2440(larger)X
-2651(than)X
-2812(the)X
-2933(backward)X
-3269(one)X
-7 s
-3385 4853(5)N
-10 s
-4885(.)Y
-3476(This)X
-3640(larger)X
-3850(size)X
-3997(shows)X
-4219(up)X
-555 4975(as)N
-642(extra)X
-823(disk)X
-976(reads)X
-1166(in)X
-1248(the)X
-1366(cold)X
-1524(benchmark.)X
-3 f
-555 5161(6.)N
-655(Conclusions)X
-1 f
-755 5284(LIBTP)N
-1006(provides)X
-1311(the)X
-1438(basic)X
-1632(building)X
-1927(blocks)X
-2165(to)X
-2256(support)X
-2525(transaction)X
-2906(protection.)X
-3300(In)X
-3396(comparison)X
-3799(with)X
-3970(traditional)X
-555 5374(Unix)N
-746(libraries)X
-1040(and)X
-1187(commercial)X
-1597(systems,)X
-1900(it)X
-1974(offers)X
-2192(a)X
-2258(variety)X
-2511(of)X
-2608(tradeoffs.)X
-2964(Using)X
-3185(complete)X
-3509(transaction)X
-3891(protection)X
-4246(is)X
-555 5464(more)N
-747(complicated)X
-1166(than)X
-1331(simply)X
-1575(adding)X
-3 f
-1820(fsync)X
-1 f
-1998(\(2\))X
-2119(and)X
-3 f
-2262(\257ock)X
-1 f
-2426(\(2\))X
-2547(calls)X
-2721(to)X
-2810(code,)X
-3008(but)X
-3136(it)X
-3206(is)X
-3285(faster)X
-3490(in)X
-3578(some)X
-3773(cases)X
-3969(and)X
-4111(offers)X
-8 s
-10 f
-555 5536(hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh)N
-5 s
-1 f
-727 5614(5)N
-8 s
-763 5639(The)N
-878(next)X
-1004(release)X
-1196(of)X
-1265(the)X
-1359(4.4BSD)X
-1580(access)X
-1758(method)X
-1966(will)X
-2082(automatically)X
-2446(detect)X
-2614(and)X
-2722(compensate)X
-3039(for)X
-3129(in-order)X
-3350(insertion,)X
-3606(eliminating)X
-3914(this)X
-4023(problem.)X
-
-16 p
-%%Page: 16 16
-8 s 8 xH 0 xS 1 f
-10 s
-3 f
-1 f
-555 630(stricter)N
-801(guarantees)X
-1168(\(atomicity,)X
-1540(consistency,)X
-1957(isolation,)X
-2275(and)X
-2414(durability\).)X
-2815(If)X
-2892(the)X
-3013(data)X
-3170(to)X
-3255(be)X
-3354(protected)X
-3676(are)X
-3798(already)X
-4058(format-)X
-555 720(ted)N
-675(\()X
-2 f
-702(i.e.)X
-1 f
-821(use)X
-949(one)X
-1086(of)X
-1174(the)X
-1293(database)X
-1591(access)X
-1818(methods\),)X
-2157(then)X
-2316(adding)X
-2555(transaction)X
-2928(protection)X
-3274(requires)X
-3554(no)X
-3655(additional)X
-3996(complex-)X
-555 810(ity,)N
-679(but)X
-801(incurs)X
-1017(a)X
-1073(performance)X
-1500(penalty)X
-1756(of)X
-1843(approximately)X
-2326(15%.)X
-755 933(In)N
-844(comparison)X
-1240(with)X
-1404(commercial)X
-1805(database)X
-2104(systems,)X
-2399(the)X
-2519(tradeoffs)X
-2827(are)X
-2948(more)X
-3135(complex.)X
-3473(LIBTP)X
-3717(does)X
-3886(not)X
-4009(currently)X
-555 1023(support)N
-825(a)X
-891(standard)X
-1193(query)X
-1406(language.)X
-1766(The)X
-1921(TCL-based)X
-2312(server)X
-2539(process)X
-2810(allows)X
-3049(a)X
-3115(certain)X
-3364(ease)X
-3533(of)X
-3630(use)X
-3767(which)X
-3993(would)X
-4223(be)X
-555 1113(enhanced)N
-882(with)X
-1047(a)X
-1106(more)X
-1294(user-friendly)X
-1732(interface)X
-2037(\()X
-2 f
-2064(e.g.)X
-1 f
-2203(a)X
-2261(windows)X
-2572(based)X
-2777(query-by-form)X
-3272(application\),)X
-3697(for)X
-3813(which)X
-4031(we)X
-4147(have)X
-555 1203(a)N
-620(working)X
-916(prototype.)X
-1292(When)X
-1513(accesses)X
-1815(do)X
-1924(not)X
-2055(require)X
-2312(sophisticated)X
-2758(query)X
-2969(processing,)X
-3360(the)X
-3486(TCL)X
-3665(interface)X
-3975(is)X
-4056(an)X
-4160(ade-)X
-555 1293(quate)N
-756(solution.)X
-1080(What)X
-1281(LIBTP)X
-1529(fails)X
-1693(to)X
-1781(provide)X
-2052(in)X
-2140(functionality,)X
-2595(it)X
-2665(makes)X
-2896(up)X
-3002(for)X
-3122(in)X
-3210(performance)X
-3643(and)X
-3785(\257exibility.)X
-4161(Any)X
-555 1383(application)N
-931(may)X
-1089(make)X
-1283(use)X
-1410(of)X
-1497(its)X
-1592(record)X
-1818(interface)X
-2120(or)X
-2207(the)X
-2325(more)X
-2510(primitive)X
-2823(log,)X
-2965(lock,)X
-3143(and)X
-3279(buffer)X
-3496(calls.)X
-755 1506(Future)N
-987(work)X
-1175(will)X
-1322(focus)X
-1519(on)X
-1621(overcoming)X
-2026(some)X
-2217(of)X
-2306(the)X
-2426(areas)X
-2614(in)X
-2698(which)X
-2916(LIBTP)X
-3160(is)X
-3235(currently)X
-3547(de\256cient)X
-3845(and)X
-3983(extending)X
-555 1596(its)N
-652(transaction)X
-1026(model.)X
-1288(The)X
-1435(addition)X
-1719(of)X
-1808(an)X
-1905(SQL)X
-2077(parser)X
-2295(and)X
-2432(forms)X
-2640(front)X
-2817(end)X
-2954(will)X
-3099(improve)X
-3387(the)X
-3506(system's)X
-3807(ease)X
-3967(of)X
-4055(use)X
-4183(and)X
-555 1686(make)N
-750(it)X
-815(more)X
-1001(competitive)X
-1400(with)X
-1563(commercial)X
-1963(systems.)X
-2277(In)X
-2365(the)X
-2484(long)X
-2647(term,)X
-2835(we)X
-2950(would)X
-3170(like)X
-3310(to)X
-3392(add)X
-3528(generalized)X
-3919(hierarchical)X
-555 1776(locking,)N
-836(nested)X
-1062(transactions,)X
-1486(parallel)X
-1748(transactions,)X
-2171(passing)X
-2431(of)X
-2518(transactions)X
-2921(between)X
-3209(processes,)X
-3557(and)X
-3693(distributed)X
-4055(commit)X
-555 1866(handling.)N
-900(In)X
-992(the)X
-1115(short)X
-1300(term,)X
-1492(the)X
-1614(next)X
-1776(step)X
-1929(is)X
-2006(to)X
-2092(integrate)X
-2397(LIBTP)X
-2643(with)X
-2809(the)X
-2931(most)X
-3110(recent)X
-3331(release)X
-3579(of)X
-3670(the)X
-3792(database)X
-4093(access)X
-555 1956(routines)N
-833(and)X
-969(make)X
-1163(it)X
-1227(freely)X
-1435(available)X
-1745(via)X
-1863(anonymous)X
-2252(ftp.)X
-3 f
-555 2142(7.)N
-655(Acknowledgements)X
-1 f
-755 2265(We)N
-888(would)X
-1109(like)X
-1250(to)X
-1332(thank)X
-1530(John)X
-1701(Wilkes)X
-1948(and)X
-2084(Carl)X
-2242(Staelin)X
-2484(of)X
-2571(Hewlett-Packard)X
-3131(Laboratories)X
-3557(and)X
-3693(Jon)X
-3824(Krueger.)X
-4148(John)X
-555 2355(and)N
-694(Carl)X
-855(provided)X
-1162(us)X
-1255(with)X
-1419(an)X
-1517(extra)X
-1700(disk)X
-1855(for)X
-1971(the)X
-2091(HP)X
-2215(testbed)X
-2464(less)X
-2606(than)X
-2766(24)X
-2868(hours)X
-3068(after)X
-3238(we)X
-3354(requested)X
-3684(it.)X
-3770(Jon)X
-3903(spent)X
-4094(count-)X
-555 2445(less)N
-699(hours)X
-901(helping)X
-1164(us)X
-1258(understand)X
-1633(the)X
-1754(intricacies)X
-2107(of)X
-2197(commercial)X
-2599(database)X
-2899(products)X
-3198(and)X
-3337(their)X
-3507(behavior)X
-3811(under)X
-4017(a)X
-4076(variety)X
-555 2535(of)N
-642(system)X
-884(con\256gurations.)X
-3 f
-555 2721(8.)N
-655(References)X
-1 f
-555 2901([ANDR89])N
-942(Andrade,)X
-1265(J.,)X
-1361(Carges,)X
-1629(M.,)X
-1765(Kovach,)X
-2060(K.,)X
-2183(``Building)X
-2541(an)X
-2642(On-Line)X
-2939(Transaction)X
-3343(Processing)X
-3715(System)X
-3975(On)X
-4098(UNIX)X
-727 2991(System)N
-982(V'',)X
-2 f
-1134(CommUNIXations)X
-1 f
-1725(,)X
-1765 0.2188(November/December)AX
-2477(1989.)X
-555 3171([BAY77])N
-878(Bayer,)X
-1110(R.,)X
-1223(Schkolnick,)X
-1623(M.,)X
-1754(``Concurrency)X
-2243(of)X
-2330(Operations)X
-2702(on)X
-2802(B-Trees'',)X
-2 f
-3155(Acta)X
-3322(Informatica)X
-1 f
-3700(,)X
-3740(1977.)X
-555 3351([BERN80])N
-936(Bernstein,)X
-1297(P.,)X
-1415(Goodman,)X
-1785(N.,)X
-1917(``Timestamp)X
-2365(Based)X
-2595(Algorithms)X
-2992(for)X
-3119(Concurrency)X
-3567(Control)X
-3844(in)X
-3939(Distributed)X
-727 3441(Database)N
-1042(Systems'',)X
-2 f
-1402(Proceedings)X
-1823(6th)X
-1945(International)X
-2387(Conference)X
-2777(on)X
-2877(Very)X
-3049(Large)X
-3260(Data)X
-3440(Bases)X
-1 f
-3627(,)X
-3667(October)X
-3946(1980.)X
-555 3621([BSD91])N
-864(DB\(3\),)X
-2 f
-1109(4.4BSD)X
-1376(Unix)X
-1552(Programmer's)X
-2044(Manual)X
-2313(Reference)X
-2655(Guide)X
-1 f
-2851(,)X
-2891(University)X
-3249(of)X
-3336(California,)X
-3701(Berkeley,)X
-4031(1991.)X
-555 3801([CATT91])N
-923(Cattell,)X
-1181(R.G.G.,)X
-1455(``An)X
-1632(Engineering)X
-2049(Database)X
-2369(Benchmark'',)X
-2 f
-2838(The)X
-2983(Benchmark)X
-3373(Handbook)X
-3731(for)X
-3848(Database)X
-4179(and)X
-727 3891(Transaction)N
-1133(Processing)X
-1509(Systems)X
-1 f
-1763(,)X
-1803(J.)X
-1874(Gray,)X
-2075(editor,)X
-2302(Morgan)X
-2576(Kaufman)X
-2895(1991.)X
-555 4071([CHEN91])N
-929(Cheng,)X
-1180(E.,)X
-1291(Chang,)X
-1542(E.,)X
-1653(Klein,)X
-1872(J.,)X
-1964(Lee,)X
-2126(D.,)X
-2245(Lu,)X
-2375(E.,)X
-2485(Lutgardo,)X
-2820(A.,)X
-2939(Obermarck,)X
-3342(R.,)X
-3456(``An)X
-3629(Open)X
-3824(and)X
-3961(Extensible)X
-727 4161(Event-Based)N
-1157(Transaction)X
-1556(Manager'',)X
-2 f
-1936(Proceedings)X
-2357(1991)X
-2537(Summer)X
-2820(Usenix)X
-1 f
-3043(,)X
-3083(Nashville,)X
-3430(TN,)X
-3577(June)X
-3744(1991.)X
-555 4341([CHOU85])N
-943(Chou,)X
-1163(H.,)X
-1288(DeWitt,)X
-1570(D.,)X
-1694(``An)X
-1872(Evaluation)X
-2245(of)X
-2338(Buffer)X
-2574(Management)X
-3019(Strategies)X
-3361(for)X
-3481(Relational)X
-3836(Database)X
-4157(Sys-)X
-727 4431(tems'',)N
-2 f
-972(Proceedings)X
-1393(of)X
-1475(the)X
-1593(11th)X
-1755(International)X
-2197(Conference)X
-2587(on)X
-2687(Very)X
-2859(Large)X
-3070(Databases)X
-1 f
-3408(,)X
-3448(1985.)X
-555 4611([DEWI84])N
-925(DeWitt,)X
-1207(D.,)X
-1331(Katz,)X
-1529(R.,)X
-1648(Olken,)X
-1890(F.,)X
-2000(Shapiro,)X
-2295(L.,)X
-2410(Stonebraker,)X
-2843(M.,)X
-2979(Wood,)X
-3220(D.,)X
-3343(``Implementation)X
-3929(Techniques)X
-727 4701(for)N
-841(Main)X
-1030(Memory)X
-1326(Database)X
-1641(Systems'',)X
-2 f
-2001(Proceedings)X
-2422(of)X
-2504(SIGMOD)X
-1 f
-2812(,)X
-2852(pp.)X
-2972(1-8,)X
-3119(June)X
-3286(1984.)X
-555 4881([GRAY76])N
-944(Gray,)X
-1153(J.,)X
-1252(Lorie,)X
-1474(R.,)X
-1595(Putzolu,)X
-1887(F.,)X
-1999(and)X
-2143(Traiger,)X
-2428(I.,)X
-2522(``Granularity)X
-2973(of)X
-3067(locks)X
-3263(and)X
-3406(degrees)X
-3679(of)X
-3773(consistency)X
-4174(in)X
-4263(a)X
-727 4971(large)N
-909(shared)X
-1140(data)X
-1295(base'',)X
-2 f
-1533(Modeling)X
-1861(in)X
-1944(Data)X
-2125(Base)X
-2301(Management)X
-2740(Systems)X
-1 f
-2994(,)X
-3034(Elsevier)X
-3317(North)X
-3524(Holland,)X
-3822(New)X
-3994(York,)X
-4199(pp.)X
-727 5061(365-394.)N
-555 5241([HAER83])N
-931(Haerder,)X
-1235(T.)X
-1348(Reuter,)X
-1606(A.)X
-1728(``Principles)X
-2126(of)X
-2217(Transaction-Oriented)X
-2928(Database)X
-3246(Recovery'',)X
-2 f
-3651(Computing)X
-4029(Surveys)X
-1 f
-4279(,)X
-727 5331(15\(4\);)N
-943(237-318,)X
-1250(1983.)X
-555 5511([KUNG81])N
-943(Kung,)X
-1162(H.)X
-1261(T.,)X
-1371(Richardson,)X
-1777(J.,)X
-1869(``On)X
-2042(Optimistic)X
-2400(Methods)X
-2701(for)X
-2816(Concurrency)X
-3252(Control'',)X
-2 f
-3591(ACM)X
-3781(Transactions)X
-4219(on)X
-727 5601(Database)N
-1054(Systems)X
-1 f
-1328(6\(2\);)X
-1504(213-226,)X
-1811(1981.)X
-
-17 p
-%%Page: 17 17
-10 s 10 xH 0 xS 1 f
-3 f
-1 f
-555 630([LEHM81])N
-939(Lehman,)X
-1245(P.,)X
-1352(Yao,)X
-1529(S.,)X
-1636(``Ef\256cient)X
-1989(Locking)X
-2279(for)X
-2396(Concurrent)X
-2780(Operations)X
-3155(on)X
-3258(B-trees'',)X
-2 f
-3587(ACM)X
-3779(Transactions)X
-4219(on)X
-727 720(Database)N
-1054(Systems)X
-1 f
-1308(,)X
-1348(6\(4\),)X
-1522(December)X
-1873(1981.)X
-555 900([MOHA91])N
-964(Mohan,)X
-1241(C.,)X
-1364(Pirahesh,)X
-1690(H.,)X
-1818(``ARIES-RRH:)X
-2366(Restricted)X
-2721(Repeating)X
-3076(of)X
-3173(History)X
-3442(in)X
-3533(the)X
-3660(ARIES)X
-3920(Transaction)X
-727 990(Recovery)N
-1055(Method'',)X
-2 f
-1398(Proceedings)X
-1819(7th)X
-1941(International)X
-2383(Conference)X
-2773(on)X
-2873(Data)X
-3053(Engineering)X
-1 f
-3449(,)X
-3489(Kobe,)X
-3703(Japan,)X
-3926(April)X
-4115(1991.)X
-555 1170([NODI90])N
-914(Nodine,)X
-1194(M.,)X
-1328(Zdonik,)X
-1602(S.,)X
-1709(``Cooperative)X
-2178(Transaction)X
-2580(Hierarchies:)X
-2996(A)X
-3077(Transaction)X
-3479(Model)X
-3711(to)X
-3796(Support)X
-4072(Design)X
-727 1260(Applications'',)N
-2 f
-1242(Proceedings)X
-1675(16th)X
-1849(International)X
-2303(Conference)X
-2704(on)X
-2815(Very)X
-2998(Large)X
-3220(Data)X
-3411(Bases)X
-1 f
-3598(,)X
-3649(Brisbane,)X
-3985(Australia,)X
-727 1350(August)N
-978(1990.)X
-555 1530([OUST90])N
-923(Ousterhout,)X
-1324(J.,)X
-1420(``Tcl:)X
-1648(An)X
-1771(Embeddable)X
-2197(Command)X
-2555(Language'',)X
-2 f
-2971(Proceedings)X
-3396(1990)X
-3580(Winter)X
-3822(Usenix)X
-1 f
-4045(,)X
-4089(Wash-)X
-727 1620(ington,)N
-971(D.C.,)X
-1162(January)X
-1432(1990.)X
-555 1800([POSIX91])N
-955(``Unapproved)X
-1441(Draft)X
-1645(for)X
-1773(Realtime)X
-2096(Extension)X
-2450(for)X
-2578(Portable)X
-2879(Operating)X
-3234(Systems'',)X
-3608(Draft)X
-3812(11,)X
-3946(October)X
-4239(7,)X
-727 1890(1991,)N
-927(IEEE)X
-1121(Computer)X
-1461(Society.)X
-555 2070([ROSE91])N
-925(Rosenblum,)X
-1341(M.,)X
-1484(Ousterhout,)X
-1892(J.,)X
-1995(``The)X
-2206(Design)X
-2464(and)X
-2611(Implementation)X
-3149(of)X
-3247(a)X
-3314(Log-Structured)X
-3835(File)X
-3990(System'',)X
-2 f
-727 2160(Proceedings)N
-1148(of)X
-1230(the)X
-1348(13th)X
-1510(Symposium)X
-1895(on)X
-1995(Operating)X
-2344(Systems)X
-2618(Principles)X
-1 f
-2947(,)X
-2987(1991.)X
-555 2340([SELT91])N
-904(Seltzer,)X
-1171(M.,)X
-1306(Stonebraker,)X
-1738(M.,)X
-1873(``Read)X
-2116(Optimized)X
-2478(File)X
-2626(Systems:)X
-2938(A)X
-3020(Performance)X
-3454(Evaluation'',)X
-2 f
-3898(Proceedings)X
-727 2430(7th)N
-849(Annual)X
-1100(International)X
-1542(Conference)X
-1932(on)X
-2032(Data)X
-2212(Engineering)X
-1 f
-2608(,)X
-2648(Kobe,)X
-2862(Japan,)X
-3085(April)X
-3274(1991.)X
-555 2610([SPEC88])N
-907(Spector,)X
-1200(Rausch,)X
-1484(Bruell,)X
-1732(``Camelot:)X
-2107(A)X
-2192(Flexible,)X
-2501(Distributed)X
-2888(Transaction)X
-3294(Processing)X
-3668(System'',)X
-2 f
-4004(Proceed-)X
-727 2700(ings)N
-880(of)X
-962(Spring)X
-1195(COMPCON)X
-1606(1988)X
-1 f
-(,)S
-1806(February)X
-2116(1988.)X
-555 2880([SQL86])N
-862(American)X
-1201(National)X
-1499(Standards)X
-1836(Institute,)X
-2139(``Database)X
-2509(Language)X
-2847(SQL'',)X
-3093(ANSI)X
-3301(X3.135-1986)X
-3747(\(ISO)X
-3924(9075\),)X
-4152(May)X
-727 2970(1986.)N
-555 3150([STON81])N
-919(Stonebraker,)X
-1348(M.,)X
-1480(``Operating)X
-1876(System)X
-2132(Support)X
-2406(for)X
-2520(Database)X
-2835(Management'',)X
-2 f
-3348(Communications)X
-3910(of)X
-3992(the)X
-4110(ACM)X
-1 f
-4279(,)X
-727 3240(1981.)N
-555 3420([SULL92])N
-925(Sullivan,)X
-1247(M.,)X
-1394(Olson,)X
-1641(M.,)X
-1788(``An)X
-1976(Index)X
-2195(Implementation)X
-2737(Supporting)X
-3127(Fast)X
-3295(Recovery)X
-3638(for)X
-3767(the)X
-3900(POSTGRES)X
-727 3510(Storage)N
-1014(System'',)X
-1365(to)X
-1469(appear)X
-1726(in)X
-2 f
-1830(Proceedings)X
-2272(8th)X
-2415(Annual)X
-2687(International)X
-3150(Conference)X
-3561(on)X
-3682(Data)X
-3883(Engineering)X
-1 f
-4279(,)X
-727 3600(Tempe,)N
-990(Arizona,)X
-1289(February)X
-1599(1992.)X
-555 3780([TPCB90])N
-914(Transaction)X
-1319(Processing)X
-1692(Performance)X
-2129(Council,)X
-2428(``TPC)X
-2653(Benchmark)X
-3048(B'',)X
-3200(Standard)X
-3510(Speci\256cation,)X
-3973(Waterside)X
-727 3870(Associates,)N
-1110(Fremont,)X
-1421(CA.,)X
-1592(1990.)X
-555 4050([YOUN91])N
-947(Young,)X
-1211(M.)X
-1328(W.,)X
-1470(Thompson,)X
-1858(D.)X
-1962(S.,)X
-2072(Jaffe,)X
-2274(E.,)X
-2388(``A)X
-2525(Modular)X
-2826(Architecture)X
-3253(for)X
-3372(Distributed)X
-3757(Transaction)X
-4161(Pro-)X
-727 4140(cessing'',)N
-2 f
-1057(Proceedings)X
-1478(1991)X
-1658(Winter)X
-1896(Usenix)X
-1 f
-2119(,)X
-2159(Dallas,)X
-2404(TX,)X
-2551(January)X
-2821(1991.)X
-3 f
-755 4263(Margo)N
-1008(I.)X
-1080(Seltzer)X
-1 f
-1338(is)X
-1411(a)X
-1467(Ph.D.)X
-1669(student)X
-1920(in)X
-2002(the)X
-2120(Department)X
-2519(of)X
-2606(Electrical)X
-2934(Engineering)X
-3346(and)X
-3482(Computer)X
-3822(Sciences)X
-4123(at)X
-4201(the)X
-555 4353(University)N
-919(of)X
-1012(California,)X
-1383(Berkeley.)X
-1739(Her)X
-1886(research)X
-2181(interests)X
-2474(include)X
-2735(\256le)X
-2862(systems,)X
-3160(databases,)X
-3513(and)X
-3654(transaction)X
-4031(process-)X
-555 4443(ing)N
-686(systems.)X
-1008(She)X
-1157(spent)X
-1355(several)X
-1612(years)X
-1811(working)X
-2107(at)X
-2194(startup)X
-2441(companies)X
-2813(designing)X
-3153(and)X
-3298(implementing)X
-3771(\256le)X
-3902(systems)X
-4183(and)X
-555 4533(transaction)N
-929(processing)X
-1294(software)X
-1592(and)X
-1729(designing)X
-2061(microprocessors.)X
-2648(Ms.)X
-2791(Seltzer)X
-3035(received)X
-3329(her)X
-3453(AB)X
-3585(in)X
-3668(Applied)X
-3947(Mathemat-)X
-555 4623(ics)N
-664(from)X
-840 0.1953(Harvard/Radcliffe)AX
-1445(College)X
-1714(in)X
-1796(1983.)X
-755 4746(In)N
-845(her)X
-971(spare)X
-1163(time,)X
-1347(Margo)X
-1583(can)X
-1717(usually)X
-1970(be)X
-2068(found)X
-2277(preparing)X
-2607(massive)X
-2887(quantities)X
-3220(of)X
-3309(food)X
-3478(for)X
-3594(hungry)X
-3843(hordes,)X
-4099(study-)X
-555 4836(ing)N
-677(Japanese,)X
-1003(or)X
-1090(playing)X
-1350(soccer)X
-1576(with)X
-1738(an)X
-1834(exciting)X
-2112(Bay)X
-2261(Area)X
-2438(Women's)X
-2770(Soccer)X
-3009(team,)X
-3205(the)X
-3323(Berkeley)X
-3633(Bruisers.)X
-3 f
-755 5049(Michael)N
-1056(A.)X
-1159(Olson)X
-1 f
-1383(is)X
-1461(a)X
-1522(Master's)X
-1828(student)X
-2084(in)X
-2170(the)X
-2292(Department)X
-2695(of)X
-2786(Electrical)X
-3118(Engineering)X
-3534(and)X
-3674(Computer)X
-4018(Sciences)X
-555 5139(at)N
-645(the)X
-774(University)X
-1143(of)X
-1241(California,)X
-1617(Berkeley.)X
-1978(His)X
-2120(primary)X
-2405(interests)X
-2703(are)X
-2833(database)X
-3141(systems)X
-3425(and)X
-3572(mass)X
-3763(storage)X
-4026(systems.)X
-555 5229(Mike)N
-759(spent)X
-963(two)X
-1118(years)X
-1323(working)X
-1625(for)X
-1754(a)X
-1825(commercial)X
-2239(database)X
-2551(system)X
-2808(vendor)X
-3066(before)X
-3307(joining)X
-3567(the)X
-3699(Postgres)X
-4004(Research)X
-555 5319(Group)N
-780(at)X
-858(Berkeley)X
-1168(in)X
-1250(1988.)X
-1470(He)X
-1584(received)X
-1877(his)X
-1990(B.A.)X
-2161(in)X
-2243(Computer)X
-2583(Science)X
-2853(from)X
-3029(Berkeley)X
-3339(in)X
-3421(May)X
-3588(1991.)X
-755 5442(Mike)N
-945(only)X
-1108(recently)X
-1388(transferred)X
-1758(into)X
-1903(Sin)X
-2030(City,)X
-2208(but)X
-2330(is)X
-2403(rapidly)X
-2650(adopting)X
-2950(local)X
-3126(customs)X
-3408(and)X
-3544(coloration.)X
-3929(In)X
-4016(his)X
-4129(spare)X
-555 5532(time,)N
-742(he)X
-843(organizes)X
-1176(informal)X
-1477(Friday)X
-1711(afternoon)X
-2043(study)X
-2240(groups)X
-2482(to)X
-2568(discuss)X
-2823(recent)X
-3044(technical)X
-3358(and)X
-3498(economic)X
-3834(developments.)X
-555 5622(Among)N
-815(his)X
-928(hobbies)X
-1197(are)X
-1316(Charles)X
-1581(Dickens,)X
-1884(Red)X
-2033(Rock,)X
-2242(and)X
-2378(speaking)X
-2683(Dutch)X
-2899(to)X
-2981(anyone)X
-3233(who)X
-3391(will)X
-3535(permit)X
-3764(it.)X
-
-17 p
-%%Trailer
-xt
-
-xs
-
diff --git a/src/util/db2/docs/mpool.3.ps b/src/util/db2/docs/mpool.3.ps
deleted file mode 100644
index 816c9243c8..0000000000
--- a/src/util/db2/docs/mpool.3.ps
+++ /dev/null
@@ -1,320 +0,0 @@
-%!PS-Adobe-3.0
-%%Creator: groff version 1.08
-%%DocumentNeededResources: font Times-Roman
-%%+ font Times-Bold
-%%+ font Times-Italic
-%%DocumentSuppliedResources: procset grops 1.08 0
-%%Pages: 2
-%%PageOrder: Ascend
-%%Orientation: Portrait
-%%EndComments
-%%BeginProlog
-%%BeginResource: procset grops 1.08 0
-/setpacking where{
-pop
-currentpacking
-true setpacking
-}if
-/grops 120 dict dup begin
-/SC 32 def
-/A/show load def
-/B{0 SC 3 -1 roll widthshow}bind def
-/C{0 exch ashow}bind def
-/D{0 exch 0 SC 5 2 roll awidthshow}bind def
-/E{0 rmoveto show}bind def
-/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
-/G{0 rmoveto 0 exch ashow}bind def
-/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/I{0 exch rmoveto show}bind def
-/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
-/K{0 exch rmoveto 0 exch ashow}bind def
-/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/M{rmoveto show}bind def
-/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
-/O{rmoveto 0 exch ashow}bind def
-/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/Q{moveto show}bind def
-/R{moveto 0 SC 3 -1 roll widthshow}bind def
-/S{moveto 0 exch ashow}bind def
-/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/SF{
-findfont exch
-[exch dup 0 exch 0 exch neg 0 0]makefont
-dup setfont
-[exch/setfont cvx]cvx bind def
-}bind def
-/MF{
-findfont
-[5 2 roll
-0 3 1 roll
-neg 0 0]makefont
-dup setfont
-[exch/setfont cvx]cvx bind def
-}bind def
-/level0 0 def
-/RES 0 def
-/PL 0 def
-/LS 0 def
-/PLG{
-gsave newpath clippath pathbbox grestore
-exch pop add exch pop
-}bind def
-/BP{
-/level0 save def
-1 setlinecap
-1 setlinejoin
-72 RES div dup scale
-LS{
-90 rotate
-}{
-0 PL translate
-}ifelse
-1 -1 scale
-}bind def
-/EP{
-level0 restore
-showpage
-}bind def
-/DA{
-newpath arcn stroke
-}bind def
-/SN{
-transform
-.25 sub exch .25 sub exch
-round .25 add exch round .25 add exch
-itransform
-}bind def
-/DL{
-SN
-moveto
-SN
-lineto stroke
-}bind def
-/DC{
-newpath 0 360 arc closepath
-}bind def
-/TM matrix def
-/DE{
-TM currentmatrix pop
-translate scale newpath 0 0 .5 0 360 arc closepath
-TM setmatrix
-}bind def
-/RC/rcurveto load def
-/RL/rlineto load def
-/ST/stroke load def
-/MT/moveto load def
-/CL/closepath load def
-/FL{
-currentgray exch setgray fill setgray
-}bind def
-/BL/fill load def
-/LW/setlinewidth load def
-/RE{
-findfont
-dup maxlength 1 index/FontName known not{1 add}if dict begin
-{
-1 index/FID ne{def}{pop pop}ifelse
-}forall
-/Encoding exch def
-dup/FontName exch def
-currentdict end definefont pop
-}bind def
-/DEFS 0 def
-/EBEGIN{
-moveto
-DEFS begin
-}bind def
-/EEND/end load def
-/CNT 0 def
-/level1 0 def
-/PBEGIN{
-/level1 save def
-translate
-div 3 1 roll div exch scale
-neg exch neg exch translate
-0 setgray
-0 setlinecap
-1 setlinewidth
-0 setlinejoin
-10 setmiterlimit
-[]0 setdash
-/setstrokeadjust where{
-pop
-false setstrokeadjust
-}if
-/setoverprint where{
-pop
-false setoverprint
-}if
-newpath
-/CNT countdictstack def
-userdict begin
-/showpage{}def
-}bind def
-/PEND{
-clear
-countdictstack CNT sub{end}repeat
-level1 restore
-}bind def
-end def
-/setpacking where{
-pop
-setpacking
-}if
-%%EndResource
-%%IncludeResource: font Times-Roman
-%%IncludeResource: font Times-Bold
-%%IncludeResource: font Times-Italic
-grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL
-792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron/scaron/zcaron
-/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space
-/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft
-/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four
-/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C
-/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash
-/bracketright/circumflex/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q
-/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase
-/guillemotleft/guillemotright/bullet/florin/fraction/perthousand/dagger
-/daggerdbl/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
-/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
-/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar
-/section/dieresis/copyright/ordfeminine/guilsinglleft/logicalnot/minus
-/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu
-/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guilsinglright
-/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde
-/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute
-/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
-/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls
-/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute
-/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve
-/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex
-/udieresis/yacute/thorn/ydieresis]def/Times-Italic@0 ENC0/Times-Italic RE
-/Times-Bold@0 ENC0/Times-Bold RE/Times-Roman@0 ENC0/Times-Roman RE
-%%EndProlog
-%%Page: 1 1
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 129.01(MPOOL\(3\) BSD)72 48 R(Programmer')2.5 E 2.5(sM)
--.55 G 129.01(anual MPOOL\(3\))340.17 48 R/F1 9/Times-Bold@0 SF -.18(NA)72 84 S
-(ME).18 E F0(mpool \255 shared memory b)108 96 Q(uf)-.2 E(fer pool)-.25 E F1
-(SYNOPSIS)72 112.8 Q/F2 10/Times-Bold@0 SF(#include <db)108 124.8 Q(.h>)-.4 E
-(#include <mpool.h>)108 136.8 Q(MPOOL *)108 160.8 Q(mpool_open \(DBT *k)108
-172.8 Q(ey)-.1 E 2.5(,i)-.55 G(nt fd, pgno_t pagesize, pgno_t maxcache\);)
-216.25 172.8 Q -.1(vo)108 196.8 S(id).1 E(mpool_\214lter \(MPOOL *mp, v)108
-208.8 Q(oid \(*pgin\)\(v)-.1 E(oid *, pgno_t, v)-.1 E(oid *\),)-.1 E -.1(vo)158
-220.8 S(id \(*pgout\)\(v).1 E(oid *, pgno_t, v)-.1 E(oid *\), v)-.1 E
-(oid *pgcookie\);)-.1 E -.1(vo)108 244.8 S(id *).1 E
-(mpool_new \(MPOOL *mp, pgno_t *pgnoaddr\);)108 256.8 Q -.1(vo)108 280.8 S
-(id *).1 E(mpool_get \(MPOOL *mp, pgno_t pgno, u_int \215ags\);)108 292.8 Q
-(int)108 316.8 Q(mpool_put \(MPOOL *mp, v)108 328.8 Q(oid *pgaddr)-.1 E 2.5(,u)
--.92 G(_int \215ags\);)290.62 328.8 Q(int)108 352.8 Q
-(mpool_sync \(MPOOL *mp\);)108 364.8 Q(int)108 388.8 Q
-(mpool_close \(MPOOL *mp\);)108 400.8 Q F1(DESCRIPTION)72 417.6 Q/F3 10
-/Times-Italic@0 SF(Mpool)108 429.6 Q F0 1.013(is the library interf)3.513 F
-1.013(ace intended to pro)-.1 F 1.013(vide page oriented b)-.15 F(uf)-.2 E
-1.012(fer management of \214les.)-.25 F 1.012(The b)6.012 F(uf)-.2 E(fers)-.25
-E(may be shared between processes.)108 441.6 Q .416(The function)108 458.4 R F3
-(mpool_open)2.916 E F0 .417(initializes a memory pool.)2.917 F(The)5.417 E F3
--.1(ke)2.917 G(y)-.2 E F0(ar)2.917 E .417(gument is the byte string used to ne)
--.18 F(gotiate)-.15 E .697(between multiple processes wishing to share b)108
-470.4 R(uf)-.2 E 3.196(fers. If)-.25 F .696(the \214le b)3.196 F(uf)-.2 E .696
-(fers are mapped in shared memory)-.25 F 3.196(,a)-.65 G(ll)534.44 470.4 Q .894
-(processes using the same k)108 482.4 R 1.194 -.15(ey w)-.1 H .894
-(ill share the b).15 F(uf)-.2 E 3.394(fers. If)-.25 F F3 -.1(ke)3.394 G(y)-.2 E
-F0 .895(is NULL, the b)3.395 F(uf)-.2 E .895(fers are mapped into pri)-.25 F
--.25(va)-.25 G(te).25 E(memory)108 494.4 Q 5.116(.T)-.65 G(he)154.406 494.4 Q
-F3(fd)2.616 E F0(ar)2.616 E .115(gument is a \214le descriptor for the underly\
-ing \214le, which must be seekable.)-.18 F(If)5.115 E F3 -.1(ke)2.615 G(y)-.2 E
-F0 .115(is non-)2.615 F(NULL and matches a \214le already being mapped, the)108
-506.4 Q F3(fd)2.5 E F0(ar)2.5 E(gument is ignored.)-.18 E(The)108 523.2 Q F3
-(pa)3.328 E -.1(ge)-.1 G(size).1 E F0(ar)3.329 E .829
-(gument is the size, in bytes, of the pages into which the \214le is brok)-.18
-F .829(en up.)-.1 F(The)5.829 E F3(maxcac)3.329 E(he)-.15 E F0(ar)108 535.2 Q
-.153(gument is the maximum number of pages from the underlying \214le to cache\
- at an)-.18 F 2.653(yo)-.15 G .153(ne time.)451.308 535.2 R .153(This v)5.153 F
-.153(alue is)-.25 F .099(not relati)108 547.2 R .399 -.15(ve t)-.25 H 2.599(ot)
-.15 G .099(he number of processes which share a \214le')168.727 547.2 R 2.6(sb)
--.55 G(uf)350.39 547.2 Q .1(fers, b)-.25 F .1(ut will be the lar)-.2 F .1
-(gest v)-.18 F .1(alue speci\214ed by)-.25 F(an)108 559.2 Q 2.5(yo)-.15 G 2.5
-(ft)129.79 559.2 S(he processes sharing the \214le.)138.4 559.2 Q(The)108 576 Q
-F3(mpool_\214lter)3.254 E F0 .754(function is intended to mak)3.254 F 3.254(et)
--.1 G .754(ransparent input and output processing of the pages possi-)301.778
-576 R 3.095(ble. If)108 588 R(the)3.095 E F3(pgin)3.095 E F0 .596
-(function is speci\214ed, it is called each time a b)3.095 F(uf)-.2 E .596
-(fer is read into the memory pool from the)-.25 F .125(backing \214le.)108 600
-R .125(If the)5.125 F F3(pgout)2.625 E F0 .125
-(function is speci\214ed, it is called each time a b)2.625 F(uf)-.2 E .125
-(fer is written into the backing \214le.)-.25 F .276
-(Both functions are are called with the)108 612 R F3(pgcookie)2.777 E F0
-(pointer)2.777 E 2.777(,t)-.4 G .277
-(he page number and a pointer to the page to being)337.27 612 R
-(read or written.)108 624 Q .124(The function)108 640.8 R F3(mpool_ne)2.624 E
-(w)-.15 E F0(tak)2.624 E .123(es an MPOOL pointer and an address as ar)-.1 F
-2.623(guments. If)-.18 F 2.623(an)2.623 G .623 -.25(ew p)457.568 640.8 T .123
-(age can be allo-).25 F .944(cated, a pointer to the page is returned and the \
-page number is stored into the)108 652.8 R F3(pgnoaddr)3.445 E F0 3.445
-(address. Other)3.445 F(-)-.2 E(wise, NULL is returned and errno is set.)108
-664.8 Q 1.167(The function)108 681.6 R F3(mpool_g)3.667 E(et)-.1 E F0(tak)3.667
-E 1.167(es a MPOOL pointer and a page number as ar)-.1 F 3.666(guments. If)-.18
-F 1.166(the page e)3.666 F 1.166(xists, a)-.15 F .686
-(pointer to the page is returned.)108 693.6 R .687
-(Otherwise, NULL is returned and errno is set.)5.686 F .687
-(The \215ags parameter is not)5.687 F(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G
-(istrib)132.57 732 Q 104.595(ution June)-.2 F(4, 1993)2.5 E(1)535 732 Q EP
-%%Page: 2 2
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 129.01(MPOOL\(3\) BSD)72 48 R(Programmer')2.5 E 2.5(sM)
--.55 G 129.01(anual MPOOL\(3\))340.17 48 R(currently used.)108 84 Q 1.463
-(The function)108 100.8 R/F1 10/Times-Italic@0 SF(mpool_put)3.963 E F0 1.462
-(unpins the page referenced by)3.962 F F1(pgaddr)3.962 E F0(.).73 E F1(Pgaddr)
-6.462 E F0 1.462(must be an address pre)3.962 F(viously)-.25 E(returned by)108
-112.8 Q F1(mpool_g)2.5 E(et)-.1 E F0(or)2.5 E F1(mpool_ne)2.5 E(w)-.15 E F0 5
-(.T).31 G(he \215ag v)271.65 112.8 Q(alue is speci\214ed by)-.25 E F1(or)2.5 E
-F0('ing an).73 E 2.5(yo)-.15 G 2.5(ft)434.74 112.8 S(he follo)443.35 112.8 Q
-(wing v)-.25 E(alues:)-.25 E(MPOOL_DIR)108 129.6 Q(TY)-.6 E
-(The page has been modi\214ed and needs to be written to the backing \214le.)
-144 141.6 Q F1(Mpool_put)108 158.4 Q F0
-(returns 0 on success and -1 if an error occurs.)2.5 E .247(The function)108
-175.2 R F1(mpool_sync)2.747 E F0 .247(writes all modi\214ed pages associated w\
-ith the MPOOL pointer to the backing \214le.)2.747 F F1(Mpool_sync)108 187.2 Q
-F0(returns 0 on success and -1 if an error occurs.)2.5 E(The)108 204 Q F1
-(mpool_close)2.698 E F0 .198(function free')2.698 F 2.698(su)-.55 G 2.698(pa)
-245.432 204 S .498 -.15(ny a)257.57 204 T .198
-(llocated memory associated with the memory pool cookie.).15 F(Modi-)5.197 E
-(\214ed pages are)108 216 Q/F2 10/Times-Bold@0 SF(not)2.5 E F0
-(written to the backing \214le.)2.5 E F1(Mpool_close)5 E F0
-(returns 0 on success and -1 if an error occurs.)2.5 E/F3 9/Times-Bold@0 SF
-(ERR)72 232.8 Q(ORS)-.27 E F0(The)108 244.8 Q F1(mpool_open)2.938 E F0 .438
-(function may f)2.938 F .438(ail and set)-.1 F F1(errno)2.938 E F0 .438(for an)
-2.938 F 2.938(yo)-.15 G 2.938(ft)344.87 244.8 S .439
-(he errors speci\214ed for the library routine)353.918 244.8 R F1(mal-)2.939 E
-(loc)108 256.8 Q F0(\(3\).).31 E(The)108 273.6 Q F1(mpool_g)2.5 E(et)-.1 E F0
-(function may f)2.5 E(ail and set)-.1 E F1(errno)2.5 E F0(for the follo)2.5 E
-(wing:)-.25 E([EINV)108 290.4 Q 29.98(AL] The)-1.35 F(requested record doesn')
-2.5 E 2.5(te)-.18 G(xist.)305.96 290.4 Q(The)108 307.2 Q F1(mpool_ne)4.073 E(w)
--.15 E F0(and)4.073 E F1(mpool_g)4.073 E(et)-.1 E F0 1.573(functions may f)
-4.073 F 1.573(ail and set)-.1 F F1(errno)4.073 E F0 1.573(for an)4.073 F 4.073
-(yo)-.15 G 4.073(ft)421.336 307.2 S 1.573(he errors speci\214ed for the)431.519
-307.2 R(library routines)108 319.2 Q F1 -.37(re)2.5 G(ad).37 E F0(\(2\)).77 E
-F1 2.5(,w).54 G(rite)214.48 319.2 Q F0(\(2\)).18 E F1(,).54 E F0(and)2.5 E F1
-(malloc)2.5 E F0(\(3\).).31 E(The)108 336 Q F1(mpool_sync)4.287 E F0 1.787
-(function may f)4.287 F 1.787(ail and set)-.1 F F1(errno)4.288 E F0 1.788
-(for an)4.288 F 4.288(yo)-.15 G 4.288(ft)356.694 336 S 1.788
-(he errors speci\214ed for the library routine)367.092 336 R F1(write)108 348 Q
-F0(\(2\).).18 E(The)108 364.8 Q F1(mpool_close)4.125 E F0 1.624(function may f)
-4.125 F 1.624(ail and set)-.1 F F1(errno)4.124 E F0 1.624(for an)4.124 F 4.124
-(yo)-.15 G 4.124(ft)357.842 364.8 S 1.624
-(he errors speci\214ed for the library routine)368.076 364.8 R F1(fr)108 376.8
-Q(ee)-.37 E F0(\(3\).).18 E F3(SEE ALSO)72 393.6 Q F1(dbopen)108 405.6 Q F0
-(\(3\),).24 E F1(btr)2.5 E(ee)-.37 E F0(\(3\),).18 E F1(hash)2.5 E F0(\(3\),)
-.28 E F1 -.37(re)2.5 G(cno).37 E F0(\(3\)).18 E(4.4 Berk)72 732 Q(ele)-.1 E 2.5
-(yD)-.15 G(istrib)132.57 732 Q 104.595(ution June)-.2 F(4, 1993)2.5 E(2)535 732
-Q EP
-%%Trailer
-end
-%%EOF
diff --git a/src/util/db2/docs/recno.3.ps b/src/util/db2/docs/recno.3.ps
deleted file mode 100644
index 8ffccfca90..0000000000
--- a/src/util/db2/docs/recno.3.ps
+++ /dev/null
@@ -1,341 +0,0 @@
-%!PS-Adobe-3.0
-%%Creator: groff version 1.08
-%%DocumentNeededResources: font Times-Roman
-%%+ font Times-Bold
-%%+ font Times-Italic
-%%DocumentSuppliedResources: procset grops 1.08 0
-%%Pages: 2
-%%PageOrder: Ascend
-%%Orientation: Portrait
-%%EndComments
-%%BeginProlog
-%%BeginResource: procset grops 1.08 0
-/setpacking where{
-pop
-currentpacking
-true setpacking
-}if
-/grops 120 dict dup begin
-/SC 32 def
-/A/show load def
-/B{0 SC 3 -1 roll widthshow}bind def
-/C{0 exch ashow}bind def
-/D{0 exch 0 SC 5 2 roll awidthshow}bind def
-/E{0 rmoveto show}bind def
-/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
-/G{0 rmoveto 0 exch ashow}bind def
-/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/I{0 exch rmoveto show}bind def
-/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
-/K{0 exch rmoveto 0 exch ashow}bind def
-/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/M{rmoveto show}bind def
-/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
-/O{rmoveto 0 exch ashow}bind def
-/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/Q{moveto show}bind def
-/R{moveto 0 SC 3 -1 roll widthshow}bind def
-/S{moveto 0 exch ashow}bind def
-/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/SF{
-findfont exch
-[exch dup 0 exch 0 exch neg 0 0]makefont
-dup setfont
-[exch/setfont cvx]cvx bind def
-}bind def
-/MF{
-findfont
-[5 2 roll
-0 3 1 roll
-neg 0 0]makefont
-dup setfont
-[exch/setfont cvx]cvx bind def
-}bind def
-/level0 0 def
-/RES 0 def
-/PL 0 def
-/LS 0 def
-/PLG{
-gsave newpath clippath pathbbox grestore
-exch pop add exch pop
-}bind def
-/BP{
-/level0 save def
-1 setlinecap
-1 setlinejoin
-72 RES div dup scale
-LS{
-90 rotate
-}{
-0 PL translate
-}ifelse
-1 -1 scale
-}bind def
-/EP{
-level0 restore
-showpage
-}bind def
-/DA{
-newpath arcn stroke
-}bind def
-/SN{
-transform
-.25 sub exch .25 sub exch
-round .25 add exch round .25 add exch
-itransform
-}bind def
-/DL{
-SN
-moveto
-SN
-lineto stroke
-}bind def
-/DC{
-newpath 0 360 arc closepath
-}bind def
-/TM matrix def
-/DE{
-TM currentmatrix pop
-translate scale newpath 0 0 .5 0 360 arc closepath
-TM setmatrix
-}bind def
-/RC/rcurveto load def
-/RL/rlineto load def
-/ST/stroke load def
-/MT/moveto load def
-/CL/closepath load def
-/FL{
-currentgray exch setgray fill setgray
-}bind def
-/BL/fill load def
-/LW/setlinewidth load def
-/RE{
-findfont
-dup maxlength 1 index/FontName known not{1 add}if dict begin
-{
-1 index/FID ne{def}{pop pop}ifelse
-}forall
-/Encoding exch def
-dup/FontName exch def
-currentdict end definefont pop
-}bind def
-/DEFS 0 def
-/EBEGIN{
-moveto
-DEFS begin
-}bind def
-/EEND/end load def
-/CNT 0 def
-/level1 0 def
-/PBEGIN{
-/level1 save def
-translate
-div 3 1 roll div exch scale
-neg exch neg exch translate
-0 setgray
-0 setlinecap
-1 setlinewidth
-0 setlinejoin
-10 setmiterlimit
-[]0 setdash
-/setstrokeadjust where{
-pop
-false setstrokeadjust
-}if
-/setoverprint where{
-pop
-false setoverprint
-}if
-newpath
-/CNT countdictstack def
-userdict begin
-/showpage{}def
-}bind def
-/PEND{
-clear
-countdictstack CNT sub{end}repeat
-level1 restore
-}bind def
-end def
-/setpacking where{
-pop
-setpacking
-}if
-%%EndResource
-%%IncludeResource: font Times-Roman
-%%IncludeResource: font Times-Bold
-%%IncludeResource: font Times-Italic
-grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL
-792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron/scaron/zcaron
-/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space
-/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft
-/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four
-/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C
-/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash
-/bracketright/circumflex/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q
-/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase
-/guillemotleft/guillemotright/bullet/florin/fraction/perthousand/dagger
-/daggerdbl/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
-/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
-/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar
-/section/dieresis/copyright/ordfeminine/guilsinglleft/logicalnot/minus
-/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu
-/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guilsinglright
-/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde
-/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute
-/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
-/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls
-/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute
-/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve
-/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex
-/udieresis/yacute/thorn/ydieresis]def/Times-Italic@0 ENC0/Times-Italic RE
-/Times-Bold@0 ENC0/Times-Bold RE/Times-Roman@0 ENC0/Times-Roman RE
-%%EndProlog
-%%Page: 1 1
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 130.12(RECNO\(3\) BSD)72 48 R(Programmer')2.5 E 2.5(sM)
--.55 G 130.12(anual RECNO\(3\))340.17 48 R/F1 9/Times-Bold@0 SF -.18(NA)72 84 S
-(ME).18 E F0(recno \255 record number database access method)108 96 Q F1
-(SYNOPSIS)72 112.8 Q/F2 10/Times-Bold@0 SF(#include <sys/types.h>)108 124.8 Q
-(#include <db)108 136.8 Q(.h>)-.4 E F1(DESCRIPTION)72 153.6 Q F0 1.158
-(The routine)108 165.6 R/F3 10/Times-Italic@0 SF(dbopen)3.658 E F0 1.158
-(is the library interf)3.658 F 1.158(ace to database \214les.)-.1 F 1.157
-(One of the supported \214le formats is record)6.158 F 1.159(number \214les.)
-108 177.6 R 1.159(The general description of the database access methods is in)
-6.159 F F3(dbopen)3.66 E F0 1.16(\(3\), this manual page).24 F
-(describes only the recno speci\214c information.)108 189.6 Q 1.944
-(The record number data structure is either v)108 206.4 R 1.944
-(ariable or \214x)-.25 F 1.944
-(ed-length records stored in a \215at-\214le format,)-.15 F 2.04
-(accessed by the logical record number)108 218.4 R 7.04(.T)-.55 G 2.04(he e)
-286.31 218.4 R 2.04(xistence of record number \214v)-.15 F 4.54(ei)-.15 G 2.04
-(mplies the e)442.1 218.4 R 2.04(xistence of)-.15 F .876
-(records one through four)108 230.4 R 3.376(,a)-.4 G .875
-(nd the deletion of record number one causes record number \214v)219.684 230.4
-R 3.375(et)-.15 G 3.375(ob)489.93 230.4 S 3.375(er)503.305 230.4 S(enum-)514.45
-230.4 Q .282(bered to record number four)108 242.4 R 2.782(,a)-.4 G 2.782(sw)
-231.19 242.4 S .283(ell as the cursor)245.082 242.4 R 2.783(,i)-.4 G 2.783(fp)
-316.633 242.4 S .283(ositioned after record number one, to shift do)327.746
-242.4 R .283(wn one)-.25 F(record.)108 254.4 Q .373
-(The recno access method speci\214c data structure pro)108 271.2 R .373
-(vided to)-.15 F F3(dbopen)2.873 E F0 .373(is de\214ned in the <db)2.873 F .373
-(.h> include \214le as)-.4 F(follo)108 283.2 Q(ws:)-.25 E(typedef struct {)108
-300 Q(u_long \215ags;)144 312 Q(u_int cachesize;)144 324 Q(u_int psize;)144 336
-Q(int lorder;)144 348 Q(size_t reclen;)144 360 Q(u_char b)144 372 Q -.25(va)
--.15 G(l;).25 E(char *bfname;)144 384 Q 2.5(}R)108 396 S(ECNOINFO;)121.97 396 Q
-(The elements of this structure are de\214ned as follo)108 412.8 Q(ws:)-.25 E
-14.61(\215ags The)108 429.6 R(\215ag v)2.5 E(alue is speci\214ed by)-.25 E F3
-(or)2.5 E F0('ing an).73 E 2.5(yo)-.15 G 2.5(ft)313.2 429.6 S(he follo)321.81
-429.6 Q(wing v)-.25 E(alues:)-.25 E(R_FIXEDLEN)144 446.4 Q .962
-(The records are \214x)180 458.4 R .963(ed-length, not byte delimited.)-.15 F
-.963(The structure element)5.963 F F3 -.37(re)3.463 G(clen).37 E F0
-(speci\214es)3.463 E .345(the length of the record, and the structure element)
-180 470.4 R F3(bval)2.844 E F0 .344(is used as the pad character)2.844 F 5.344
-(.A)-.55 G -.15(ny)530.15 470.4 S .739
-(records, inserted into the database, that are less than)180 482.4 R F3 -.37
-(re)3.239 G(clen).37 E F0 .74(bytes long are automatically)3.239 F(padded.)180
-494.4 Q(R_NOKEY)144 511.2 Q 2.34(In the interf)180 523.2 R 2.34
-(ace speci\214ed by)-.1 F F3(dbopen)4.84 E F0 4.84(,t).24 G 2.34
-(he sequential record retrie)344.98 523.2 R -.25(va)-.25 G 4.84<6c8c>.25 G 2.34
-(lls in both the)478.25 523.2 R(caller')180 535.2 Q 3.556(sk)-.55 G 1.357 -.15
-(ey a)217.336 535.2 T 1.057(nd data structures.).15 F 1.057
-(If the R_NOKEY \215ag is speci\214ed, the)6.057 F F3(cur)3.557 E(sor)-.1 E F0
-(routines)3.557 E .029(are not required to \214ll in the k)180 547.2 R .329
--.15(ey s)-.1 H 2.529(tructure. This).15 F .028(permits applications to retrie)
-2.529 F .328 -.15(ve r)-.25 H .028(ecords at).15 F
-(the end of \214les without reading all of the interv)180 559.2 Q
-(ening records.)-.15 E(R_SN)144 576 Q(APSHO)-.35 E(T)-.4 E .964
-(This \215ag requires that a snapshot of the \214le be tak)180 588 R .965
-(en when)-.1 F F3(dbopen)3.465 E F0 .965(is called, instead of)3.465 F
-(permitting an)180 600 Q 2.5(yu)-.15 G
-(nmodi\214ed records to be read from the original \214le.)245.96 600 Q
-(cachesize)108 616.8 Q 3.16(As)144 628.8 S .66
-(uggested maximum size, in bytes, of the memory cache.)158.27 628.8 R .659
-(This v)5.659 F .659(alue is)-.25 F F2(only)3.159 E F0(advisory)3.159 E 3.159
-(,a)-.65 G .659(nd the)514.621 628.8 R .046
-(access method will allocate more memory rather than f)144 640.8 R 2.546
-(ail. If)-.1 F F3(cac)2.546 E(hesize)-.15 E F0 2.546(is 0)2.546 F .046
-(\(no size is speci\214ed\) a)2.546 F(def)144 652.8 Q(ault cache is used.)-.1 E
-12.95(psize The)108 669.6 R .715
-(recno access method stores the in-memory copies of its records in a btree.)
-3.216 F .715(This v)5.715 F .715(alue is the)-.25 F .805
-(size \(in bytes\) of the pages used for nodes in that tree.)144 681.6 R(If)
-5.805 E F3(psize)3.305 E F0 .806(is 0 \(no page size is speci\214ed\) a)3.305 F
-1.468
-(page size is chosen based on the underlying \214le system I/O block size.)144
-693.6 R(See)6.467 E F3(btr)3.967 E(ee)-.37 E F0 1.467(\(3\) for more).18 F
-(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q 96.815
-(ution August)-.2 F(18, 1994)2.5 E(1)535 732 Q EP
-%%Page: 2 2
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 130.12(RECNO\(3\) BSD)72 48 R(Programmer')2.5 E 2.5(sM)
--.55 G 130.12(anual RECNO\(3\))340.17 48 R(information.)144 84 Q 9.62
-(lorder The)108 100.8 R 1.596(byte order for inte)4.096 F 1.596
-(gers in the stored database metadata.)-.15 F 1.597
-(The number should represent the)6.597 F .689(order as an inte)144 112.8 R .689
-(ger; for e)-.15 F .689(xample, big endian order w)-.15 F .689
-(ould be the number 4,321.)-.1 F(If)5.689 E/F1 10/Times-Italic@0 SF(lor)3.189 E
-(der)-.37 E F0 .688(is 0 \(no)3.189 F
-(order is speci\214ed\) the current host order is used.)144 124.8 Q 9.07
-(reclen The)108 141.6 R(length of a \214x)2.5 E(ed-length record.)-.15 E -.15
-(bv)108 158.4 S 16.68(al The)-.1 F .182
-(delimiting byte to be used to mark the end of a record for v)2.682 F .183
-(ariable-length records, and the pad)-.25 F .809(character for \214x)144 170.4
-R .809(ed-length records.)-.15 F .809(If no v)5.809 F .809
-(alue is speci\214ed, ne)-.25 F .809(wlines \(`)-.25 F(`\\n')-.74 E .808
-('\) are used to mark the)-.74 F(end of v)144 182.4 Q
-(ariable-length records and \214x)-.25 E
-(ed-length records are padded with spaces.)-.15 E 3.51(bfname The)108 199.2 R
-.505
-(recno access method stores the in-memory copies of its records in a btree.)
-3.005 F .506(If bfname is non-)5.506 F .065(NULL, it speci\214es the name of t\
-he btree \214le, as if speci\214ed as the \214le name for a dbopen of a btree)
-144 211.2 R(\214le.)144 223.2 Q .971(The data part of the k)108 240 R -.15(ey)
--.1 G .972(/data pair used by the recno access method is the same as other acc\
-ess methods.).15 F .199(The k)108 252 R .499 -.15(ey i)-.1 H 2.699(sd).15 G(if)
-157.507 252 Q 2.699(ferent. The)-.25 F F1(data)2.699 E F0 .199
-(\214eld of the k)2.699 F .499 -.15(ey s)-.1 H .198
-(hould be a pointer to a memory location of type).15 F F1 -.37(re)2.698 G
-(cno_t).37 E F0 2.698(,a).68 G(s)536.11 252 Q .505(de\214ned in the <db)108 264
-R .506(.h> include \214le.)-.4 F .506(This type is normally the lar)5.506 F
-.506(gest unsigned inte)-.18 F .506(gral type a)-.15 F -.25(va)-.2 G .506
-(ilable to the).25 F 2.5(implementation. The)108 276 R F1(size)2.5 E F0
-(\214eld of the k)2.5 E .3 -.15(ey s)-.1 H(hould be the size of that type.).15
-E .706(Because there can be no meta-data associated with the underlying recno \
-access method \214les, an)108 292.8 R 3.206(yc)-.15 G(hanges)512.23 292.8 Q
-1.262(made to the def)108 304.8 R 1.262(ault v)-.1 F 1.262(alues \(e.g. \214x)
--.25 F 1.263(ed record length or byte separator v)-.15 F 1.263
-(alue\) must be e)-.25 F 1.263(xplicitly speci\214ed)-.15 F
-(each time the \214le is opened.)108 316.8 Q .065(In the interf)108 333.6 R
-.065(ace speci\214ed by)-.1 F F1(dbopen)2.564 E F0 2.564(,u).24 G .064
-(sing the)261.548 333.6 R F1(put)2.564 E F0(interf)2.564 E .064
-(ace to create a ne)-.1 F 2.564(wr)-.25 G .064
-(ecord will cause the creation of)414.44 333.6 R .755(multiple, empty records \
-if the record number is more than one greater than the lar)108 345.6 R .755
-(gest record currently in)-.18 F(the database.)108 357.6 Q/F2 9/Times-Bold@0 SF
-(ERR)72 374.4 Q(ORS)-.27 E F0(The)108 386.4 Q F1 -.37(re)2.922 G(cno).37 E F0
-.421(access method routines may f)2.921 F .421(ail and set)-.1 F F1(errno)2.921
-E F0 .421(for an)2.921 F 2.921(yo)-.15 G 2.921(ft)377.933 386.4 S .421
-(he errors speci\214ed for the library rou-)386.964 386.4 R(tine)108 398.4 Q F1
-(dbopen)2.5 E F0(\(3\) or the follo).24 E(wing:)-.25 E([EINV)108 415.2 Q(AL])
--1.35 E(An attempt w)144 427.2 Q(as made to add a record to a \214x)-.1 E
-(ed-length database that w)-.15 E(as too lar)-.1 E(ge to \214t.)-.18 E F2
-(SEE ALSO)72 444 Q F1(btr)108 456 Q(ee)-.37 E F0(\(3\)).18 E F1(dbopen)2.5 E F0
-(\(3\),).24 E F1(hash)2.5 E F0(\(3\),).28 E F1(mpool)2.5 E F0(\(3\),).51 E F1
-2.754(Document Pr)108 480 R 2.754(ocessing in a Relational Database System)-.45
-F F0 5.255(,M).32 G 2.755(ichael Stonebrak)362.13 480 R(er)-.1 E 5.255(,H)-.4 G
-2.755(eidi Stettner)454.06 480 R 5.255(,J)-.4 G(oseph)516.67 480 Q
-(Kalash, Antonin Guttman, Nadene L)108 492 Q
-(ynn, Memorandum No. UCB/ERL M82/32, May 1982.)-.55 E F2 -.09(BU)72 508.8 S(GS)
-.09 E F0(Only big and little endian byte order is supported.)108 520.8 Q
-(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q 96.815
-(ution August)-.2 F(18, 1994)2.5 E(2)535 732 Q EP
-%%Trailer
-end
-%%EOF
diff --git a/src/util/db2/hash/Makefile.in b/src/util/db2/hash/Makefile.in
deleted file mode 100644
index e8cbe63bd7..0000000000
--- a/src/util/db2/hash/Makefile.in
+++ /dev/null
@@ -1,13 +0,0 @@
-thisconfigdir=./..
-myfulldir=util/db2/hash
-mydir=hash
-BUILDTOP=$(REL)..$(S)..$(S)..
-STLIBOBJS= hash.o hash_bigkey.o hash_debug.o hash_func.o hash_log2.o \
- hash_page.o hsearch.o dbm.o
-
-LOCALINCLUDES= -I. -I$(srcdir)/../include -I../include -I$(srcdir)/../mpool \
- -I$(srcdir)/../db
-
-all-unix:: all-libobjs
-clean-unix:: clean-libobjs
-# @libobj_frag@
diff --git a/src/util/db2/hash/Makefile.inc b/src/util/db2/hash/Makefile.inc
deleted file mode 100644
index 87746f721e..0000000000
--- a/src/util/db2/hash/Makefile.inc
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile.inc 8.2 (Berkeley) 11/7/95
-
-.PATH: ${.CURDIR}/db/hash
-
-SRCS+= hash.c hash_bigkey.c hash_buf.c hash_func.c hash_log2.c \
- hash_page.c hsearch.c dbm.c
diff --git a/src/util/db2/hash/dbm.c b/src/util/db2/hash/dbm.c
deleted file mode 100644
index 58c9df7383..0000000000
--- a/src/util/db2/hash/dbm.c
+++ /dev/null
@@ -1,356 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Margo Seltzer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)dbm.c 8.6 (Berkeley) 11/7/95";
-#endif /* LIBC_SCCS and not lint */
-
-#include "db-int.h"
-
-#include <sys/param.h>
-
-#include <fcntl.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "db-ndbm.h"
-#include "db-dbm.h"
-#include "hash.h"
-
-/* If the two size fields of datum and DBMT are not equal, then
- * casting between structures will result in stack garbage being
- * transfered. Has been observed for DEC Alpha OSF, but will handle
- * the general case.
- */
-
-#define NEED_COPY
-
-/*
- *
- * This package provides dbm and ndbm compatible interfaces to DB.
- * First are the DBM routines, which call the NDBM routines, and
- * the NDBM routines, which call the DB routines.
- */
-static DBM *__cur_db;
-
-static void no_open_db __P((void));
-
-int
-kdb2_dbminit(file)
- char *file;
-{
- if (__cur_db != NULL)
- (void)kdb2_dbm_close(__cur_db);
- if ((__cur_db = kdb2_dbm_open(file, O_RDWR|O_BINARY, 0)) != NULL)
- return (0);
- if ((__cur_db = kdb2_dbm_open(file, O_RDONLY|O_BINARY, 0)) != NULL)
- return (0);
- return (-1);
-}
-
-datum
-kdb2_fetch(key)
- datum key;
-{
- datum item;
-
- if (__cur_db == NULL) {
- no_open_db();
- item.dptr = 0;
- return (item);
- }
- return (kdb2_dbm_fetch(__cur_db, key));
-}
-
-datum
-kdb2_firstkey()
-{
- datum item;
-
- if (__cur_db == NULL) {
- no_open_db();
- item.dptr = 0;
- return (item);
- }
- return (kdb2_dbm_firstkey(__cur_db));
-}
-
-datum
-kdb2_nextkey(key)
- datum key;
-{
- datum item;
-
- if (__cur_db == NULL) {
- no_open_db();
- item.dptr = 0;
- return (item);
- }
- return (kdb2_dbm_nextkey(__cur_db));
-}
-
-int
-kdb2_delete(key)
- datum key;
-{
- if (__cur_db == NULL) {
- no_open_db();
- return (-1);
- }
- return (kdb2_dbm_delete(__cur_db, key));
-}
-
-int
-kdb2_store(key, dat)
- datum key, dat;
-{
- if (__cur_db == NULL) {
- no_open_db();
- return (-1);
- }
- return (kdb2_dbm_store(__cur_db, key, dat, DBM_REPLACE));
-}
-
-static void
-no_open_db()
-{
- (void)fprintf(stderr, "dbm: no open database.\n");
-}
-
-/*
- * Returns:
- * *DBM on success
- * NULL on failure
- */
-DBM *
-kdb2_dbm_open(file, flags, mode)
- const char *file;
- int flags, mode;
-{
- HASHINFO info;
- char path[MAXPATHLEN];
-
- info.bsize = 4096;
- info.ffactor = 40;
- info.nelem = 1;
- info.cachesize = 0;
- info.hash = NULL;
- info.lorder = 0;
- (void)strncpy(path, file, sizeof(path) - 1);
- path[sizeof(path) - 1] = '\0';
- (void)strncat(path, DBM_SUFFIX, sizeof(path) - 1 - strlen(path));
- return ((DBM *)__hash_open(path, flags, mode, &info, 0));
-}
-
-/*
- * Returns:
- * Nothing.
- */
-void
-kdb2_dbm_close(db)
- DBM *db;
-{
- (void)(db->close)(db);
-}
-
-/*
- * Returns:
- * DATUM on success
- * NULL on failure
- */
-datum
-kdb2_dbm_fetch(db, key)
- DBM *db;
- datum key;
-{
- datum retval;
- int status;
-
-#ifdef NEED_COPY
- DBT k, r;
-
- k.data = key.dptr;
- k.size = key.dsize;
- status = (db->get)(db, &k, &r, 0);
- retval.dptr = r.data;
- retval.dsize = r.size;
-#else
- status = (db->get)(db, (DBT *)&key, (DBT *)&retval, 0);
-#endif
- if (status) {
- retval.dptr = NULL;
- retval.dsize = 0;
- }
- return (retval);
-}
-
-/*
- * Returns:
- * DATUM on success
- * NULL on failure
- */
-datum
-kdb2_dbm_firstkey(db)
- DBM *db;
-{
- int status;
- datum retkey;
-
-#ifdef NEED_COPY
- DBT k, r;
-
- status = (db->seq)(db, &k, &r, R_FIRST);
- retkey.dptr = k.data;
- retkey.dsize = k.size;
-#else
- datum retdata;
-
- status = (db->seq)(db, (DBT *)&retkey, (DBT *)&retdata, R_FIRST);
-#endif
- if (status)
- retkey.dptr = NULL;
- return (retkey);
-}
-
-/*
- * Returns:
- * DATUM on success
- * NULL on failure
- */
-datum
-kdb2_dbm_nextkey(db)
- DBM *db;
-{
- int status;
- datum retkey;
-
-#ifdef NEED_COPY
- DBT k, r;
-
- status = (db->seq)(db, &k, &r, R_NEXT);
- retkey.dptr = k.data;
- retkey.dsize = k.size;
-#else
- datum retdata;
-
- status = (db->seq)(db, (DBT *)&retkey, (DBT *)&retdata, R_NEXT);
-#endif
- if (status)
- retkey.dptr = NULL;
- return (retkey);
-}
-
-/*
- * Returns:
- * 0 on success
- * <0 failure
- */
-int
-kdb2_dbm_delete(db, key)
- DBM *db;
- datum key;
-{
- int status;
-
-#ifdef NEED_COPY
- DBT k;
-
- k.data = key.dptr;
- k.size = key.dsize;
- status = (db->del)(db, &k, 0);
-#else
- status = (db->del)(db, (DBT *)&key, 0);
-#endif
- if (status)
- return (-1);
- else
- return (0);
-}
-
-/*
- * Returns:
- * 0 on success
- * <0 failure
- * 1 if DBM_INSERT and entry exists
- */
-int
-kdb2_dbm_store(db, key, content, flags)
- DBM *db;
- datum key, content;
- int flags;
-{
-#ifdef NEED_COPY
- DBT k, c;
-
- k.data = key.dptr;
- k.size = key.dsize;
- c.data = content.dptr;
- c.size = content.dsize;
- return ((db->put)(db, &k, &c,
- (flags == DBM_INSERT) ? R_NOOVERWRITE : 0));
-#else
- return ((db->put)(db, (DBT *)&key, (DBT *)&content,
- (flags == DBM_INSERT) ? R_NOOVERWRITE : 0));
-#endif
-}
-
-int
-kdb2_dbm_error(db)
- DBM *db;
-{
- HTAB *hp;
-
- hp = (HTAB *)db->internal;
- return (hp->local_errno);
-}
-
-int
-kdb2_dbm_clearerr(db)
- DBM *db;
-{
- HTAB *hp;
-
- hp = (HTAB *)db->internal;
- hp->local_errno = 0;
- return (0);
-}
-
-int
-kdb2_dbm_dirfno(db)
- DBM *db;
-{
- return(((HTAB *)db->internal)->fp);
-}
diff --git a/src/util/db2/hash/extern.h b/src/util/db2/hash/extern.h
deleted file mode 100644
index 872b6b0fef..0000000000
--- a/src/util/db2/hash/extern.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.8 (Berkeley) 11/7/95
- */
-
-#define __add_bigpage __kdb2_add_bigpage
-#define __add_ovflpage __kdb2_add_ovflpage
-#define __addel __kdb2_addel
-#define __alloc_tmp __kdb2_alloc_tmp
-#define __big_delete __kdb2_big_delete
-#define __big_insert __kdb2_big_insert
-#define __big_keydata __kdb2_big_keydata
-#define __big_return __kdb2_big_return
-#define __call_hash __kdb2_call_hash
-#define __cursor_creat __kdb2_cursor_creat
-#define __delete_page __kdb2_delete_page
-#define __delpair __kdb2_delpair
-#define __expand_table __kdb2_expand_table
-#define __find_bigpair __kdb2_find_bigpair
-#define __free_ovflpage __kdb2_free_ovflpage
-#define __get_bigkey __kdb2_get_bigkey
-#define __get_buf __kdb2_get_buf
-#define __get_item __kdb2_get_item
-#define __get_item_done __kdb2_get_item_done
-#define __get_item_first __kdb2_get_item_first
-#define __get_item_next __kdb2_get_item_next
-#define __get_item_reset __kdb2_get_item_reset
-#define __get_page __kdb2_get_page
-#define __ibitmap __kdb2_ibitmap
-#define __log2 __kdb2_log2
-#define __new_page __kdb2_new_page
-#define __pgin_routine __kdb2_pgin_routine
-#define __pgout_routine __kdb2_pgout_routine
-#define __put_buf __kdb2_put_buf
-#define __put_page __kdb2_put_page
-#define __reclaim_tmp __kdb2_reclaim_tmp
-#define __split_page __kdb2_split_page
-
-PAGE16 *__add_bigpage __P((HTAB *, PAGE16 *, indx_t, const u_int8_t));
-PAGE16 *__add_ovflpage __P((HTAB *, PAGE16 *));
-int32_t __addel __P((HTAB *, ITEM_INFO *,
- const DBT *, const DBT *, u_int32_t, const u_int8_t));
-u_int32_t __alloc_tmp __P((HTAB*));
-int32_t __big_delete __P((HTAB *, PAGE16 *, indx_t));
-int32_t __big_insert __P((HTAB *, PAGE16 *, const DBT *, const DBT *));
-int32_t __big_keydata __P((HTAB *, PAGE16 *, DBT *, DBT *, int32_t));
-int32_t __big_return __P((HTAB *, ITEM_INFO *, DBT *, int32_t));
-u_int32_t __call_hash __P((HTAB *, int8_t *, int32_t));
-CURSOR *__cursor_creat __P((const DB *));
-int32_t __delete_page __P((HTAB *, PAGE16 *, int32_t));
-int32_t __delpair __P((HTAB *, CURSOR *, ITEM_INFO *));
-int32_t __expand_table __P((HTAB *));
-int32_t __find_bigpair __P((HTAB *, CURSOR *, int8_t *, int32_t));
-void __free_ovflpage __P((HTAB *, PAGE16 *));
-int32_t __get_bigkey __P((HTAB *, PAGE16 *, indx_t, DBT *));
-PAGE16 *__get_buf __P((HTAB *, u_int32_t, int32_t));
-u_int32_t __get_item __P((HTAB *, CURSOR *, DBT *, DBT *, ITEM_INFO *));
-u_int32_t __get_item_done __P((HTAB *, CURSOR *));
-u_int32_t __get_item_first __P((HTAB *, CURSOR *, DBT *, DBT *, ITEM_INFO *));
-u_int32_t __get_item_next __P((HTAB *, CURSOR *, DBT *, DBT *, ITEM_INFO *));
-u_int32_t __get_item_reset __P((HTAB *, CURSOR *));
-PAGE16 *__get_page __P((HTAB *, u_int32_t, int32_t));
-int32_t __ibitmap __P((HTAB *, int32_t, int32_t, int32_t));
-u_int32_t __log2 __P((u_int32_t));
-int32_t __new_page __P((HTAB *, u_int32_t, int32_t));
-void __pgin_routine __P((void *, db_pgno_t, void *));
-void __pgout_routine __P((void *, db_pgno_t, void *));
-u_int32_t __put_buf __P((HTAB *, PAGE16 *, u_int32_t));
-int32_t __put_page __P((HTAB *, PAGE16 *, int32_t, int32_t));
-void __reclaim_tmp __P((HTAB *));
-int32_t __split_page __P((HTAB *, u_int32_t, u_int32_t));
-
-/* Default hash routine. */
-extern u_int32_t (*__default_hash) __P((const void *, size_t));
-
-#ifdef HASH_STATISTICS
-extern long hash_accesses, hash_bigpages, hash_collisions, hash_expansions;
-extern long hash_overflow;
-#endif
diff --git a/src/util/db2/hash/hash.c b/src/util/db2/hash/hash.c
deleted file mode 100644
index 0e254938e9..0000000000
--- a/src/util/db2/hash/hash.c
+++ /dev/null
@@ -1,1068 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Margo Seltzer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)hash.c 8.12 (Berkeley) 11/7/95";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/param.h>
-#include <sys/stat.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#ifdef DEBUG
-#include <assert.h>
-#endif
-
-#include "db-int.h"
-#include "hash.h"
-#include "page.h"
-#include "extern.h"
-
-static int32_t flush_meta __P((HTAB *));
-static int32_t hash_access __P((HTAB *, ACTION, const DBT *, DBT *));
-static int32_t hash_close __P((DB *));
-static int32_t hash_delete __P((const DB *, const DBT *, u_int32_t));
-static int32_t hash_fd __P((const DB *));
-static int32_t hash_get __P((const DB *, const DBT *, DBT *, u_int32_t));
-static int32_t hash_put __P((const DB *, DBT *, const DBT *, u_int32_t));
-static int32_t hash_seq __P((const DB *, DBT *, DBT *, u_int32_t));
-static int32_t hash_sync __P((const DB *, u_int32_t));
-static int32_t hdestroy __P((HTAB *));
-static int32_t cursor_get __P((const DB *, CURSOR *, DBT *, DBT *, \
- u_int32_t));
-static int32_t cursor_delete __P((const DB *, CURSOR *, u_int32_t));
-static HTAB *init_hash __P((HTAB *, const char *, const HASHINFO *));
-static int32_t init_htab __P((HTAB *, int32_t));
-#if DB_BYTE_ORDER == DB_LITTLE_ENDIAN
-static void swap_header __P((HTAB *));
-static void swap_header_copy __P((HASHHDR *, HASHHDR *));
-#endif
-static u_int32_t hget_header __P((HTAB *, u_int32_t));
-static void hput_header __P((HTAB *));
-
-#define RETURN_ERROR(ERR, LOC) { save_errno = ERR; goto LOC; }
-
-/* Return values */
-#define SUCCESS (0)
-#define ERROR (-1)
-#define ABNORMAL (1)
-
-#ifdef HASH_STATISTICS
-u_int32_t hash_accesses, hash_collisions, hash_expansions, hash_overflows,
- hash_bigpages;
-#endif
-
-/************************** INTERFACE ROUTINES ***************************/
-/* OPEN/CLOSE */
-
-extern DB *
-__kdb2_hash_open(file, flags, mode, info, dflags)
- const char *file;
- int32_t flags, mode, dflags;
- const HASHINFO *info; /* Special directives for create */
-{
- struct stat statbuf;
- DB *dbp;
- DBT mpool_key;
- HTAB *hashp;
- int32_t bpages, csize, new_table, save_errno, specified_file;
-
- if ((flags & O_ACCMODE) == O_WRONLY) {
- errno = EINVAL;
- return (NULL);
- }
- if (!(hashp = (HTAB *)calloc(1, sizeof(HTAB))))
- return (NULL);
- hashp->fp = -1;
-
- /* set this now, before file goes away... */
- specified_file = (file != NULL);
- if (!file) {
- file = tmpnam(NULL);
- /* store the file name so that we can unlink it later */
- hashp->fname = file;
-#ifdef DEBUG
- fprintf(stderr, "Using file name %s.\n", file);
-#endif
- }
- /*
- * Even if user wants write only, we need to be able to read
- * the actual file, so we need to open it read/write. But, the
- * field in the hashp structure needs to be accurate so that
- * we can check accesses.
- */
- hashp->flags = flags;
- hashp->save_file = specified_file && (hashp->flags & O_RDWR);
-
- new_table = 0;
- if (!file || (flags & O_TRUNC) ||
- (stat(file, &statbuf) && (errno == ENOENT))) {
- if (errno == ENOENT)
- errno = 0; /* In case someone looks at errno. */
- new_table = 1;
- }
- if (file) {
- if ((hashp->fp = open(file, flags|O_BINARY, mode)) == -1)
- RETURN_ERROR(errno, error0);
- (void)fcntl(hashp->fp, F_SETFD, 1);
- }
-
- /* Process arguments to set up hash table header. */
- if (new_table) {
- if (!(hashp = init_hash(hashp, file, info)))
- RETURN_ERROR(errno, error1);
- } else {
- /* Table already exists */
- if (info && info->hash)
- hashp->hash = info->hash;
- else
- hashp->hash = __default_hash;
-
- /* copy metadata from page into header */
- if (hget_header(hashp,
- (info && info->bsize ? info->bsize : DEF_BUCKET_SIZE)) !=
- sizeof(HASHHDR))
- RETURN_ERROR(EFTYPE, error1);
-
- /* Verify file type, versions and hash function */
- if (hashp->hdr.magic != HASHMAGIC)
- RETURN_ERROR(EFTYPE, error1);
-#define OLDHASHVERSION 1
- if (hashp->hdr.version != HASHVERSION &&
- hashp->hdr.version != OLDHASHVERSION)
- RETURN_ERROR(EFTYPE, error1);
- if (hashp->hash(CHARKEY, sizeof(CHARKEY))
- != hashp->hdr.h_charkey)
- RETURN_ERROR(EFTYPE, error1);
- /*
- * Figure out how many segments we need. Max_Bucket is the
- * maximum bucket number, so the number of buckets is
- * max_bucket + 1.
- */
-
- /* Read in bitmaps */
- bpages = (hashp->hdr.spares[hashp->hdr.ovfl_point] +
- (hashp->hdr.bsize << BYTE_SHIFT) - 1) >>
- (hashp->hdr.bshift + BYTE_SHIFT);
-
- hashp->nmaps = bpages;
- (void)memset(&hashp->mapp[0], 0, bpages * sizeof(u_int32_t *));
- }
-
- /* start up mpool */
- mpool_key.data = (u_int8_t *)file;
- mpool_key.size = strlen(file);
-
- if (info && info->cachesize)
- csize = info->cachesize / hashp->hdr.bsize;
- else
- csize = DEF_CACHESIZE / hashp->hdr.bsize;
- hashp->mp = mpool_open(&mpool_key, hashp->fp, hashp->hdr.bsize, csize);
-
- if (!hashp->mp)
- RETURN_ERROR(errno, error1);
- mpool_filter(hashp->mp, __pgin_routine, __pgout_routine, hashp);
-
- /*
- * For a new table, set up the bitmaps.
- */
- if (new_table &&
- init_htab(hashp, info && info->nelem ? info->nelem : 1))
- goto error2;
-
- /* initialize the cursor queue */
- TAILQ_INIT(&hashp->curs_queue);
- hashp->seq_cursor = NULL;
-
-
- /* get a chunk of memory for our split buffer */
- hashp->split_buf = (PAGE16 *)malloc(hashp->hdr.bsize);
- if (!hashp->split_buf)
- goto error2;
-
- hashp->new_file = new_table;
-
- if (!(dbp = (DB *)malloc(sizeof(DB))))
- goto error2;
-
- dbp->internal = hashp;
- dbp->close = hash_close;
- dbp->del = hash_delete;
- dbp->fd = hash_fd;
- dbp->get = hash_get;
- dbp->put = hash_put;
- dbp->seq = hash_seq;
- dbp->sync = hash_sync;
- dbp->type = DB_HASH;
-
-#ifdef DEBUG
- (void)fprintf(stderr,
- "%s\n%s%lx\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%x\n%s%x\n%s%d\n%s%d\n",
- "init_htab:",
- "TABLE POINTER ", (void *)hashp,
- "BUCKET SIZE ", hashp->hdr.bsize,
- "BUCKET SHIFT ", hashp->hdr.bshift,
- "FILL FACTOR ", hashp->hdr.ffactor,
- "MAX BUCKET ", hashp->hdr.max_bucket,
- "OVFL POINT ", hashp->hdr.ovfl_point,
- "LAST FREED ", hashp->hdr.last_freed,
- "HIGH MASK ", hashp->hdr.high_mask,
- "LOW MASK ", hashp->hdr.low_mask,
- "NKEYS ", hashp->hdr.nkeys);
-#endif
-#ifdef HASH_STATISTICS
- hash_overflows = hash_accesses = hash_collisions = hash_expansions = 0;
- hash_bigpages = 0;
-#endif
- return (dbp);
-
-error2:
- save_errno = errno;
- hdestroy(hashp);
- errno = save_errno;
- return (NULL);
-
-error1:
- if (hashp != NULL)
- (void)close(hashp->fp);
-
-error0:
- free(hashp);
- errno = save_errno;
- return (NULL);
-}
-
-static int32_t
-hash_close(dbp)
- DB *dbp;
-{
- HTAB *hashp;
- int32_t retval;
-
- if (!dbp)
- return (ERROR);
-
- hashp = (HTAB *)dbp->internal;
- retval = hdestroy(hashp);
- free(dbp);
- return (retval);
-}
-
-static int32_t
-hash_fd(dbp)
- const DB *dbp;
-{
- HTAB *hashp;
-
- if (!dbp)
- return (ERROR);
-
- hashp = (HTAB *)dbp->internal;
- if (hashp->fp == -1) {
- errno = ENOENT;
- return (-1);
- }
- return (hashp->fp);
-}
-
-/************************** LOCAL CREATION ROUTINES **********************/
-static HTAB *
-init_hash(hashp, file, info)
- HTAB *hashp;
- const char *file;
- const HASHINFO *info;
-{
- struct stat statbuf;
- int32_t nelem;
-
- nelem = 1;
- hashp->hdr.nkeys = 0;
- hashp->hdr.lorder = DB_BYTE_ORDER;
- hashp->hdr.bsize = DEF_BUCKET_SIZE;
- hashp->hdr.bshift = DEF_BUCKET_SHIFT;
- hashp->hdr.ffactor = DEF_FFACTOR;
- hashp->hash = __default_hash;
- memset(hashp->hdr.spares, 0, sizeof(hashp->hdr.spares));
- memset(hashp->hdr.bitmaps, 0, sizeof(hashp->hdr.bitmaps));
-
- /* Fix bucket size to be optimal for file system */
- if (file != NULL) {
- if (stat(file, &statbuf))
- return (NULL);
- hashp->hdr.bsize = statbuf.st_blksize;
- hashp->hdr.bshift = __log2(hashp->hdr.bsize);
- }
- if (info) {
- if (info->bsize) {
- /* Round pagesize up to power of 2 */
- hashp->hdr.bshift = __log2(info->bsize);
- hashp->hdr.bsize = 1 << hashp->hdr.bshift;
- if (hashp->hdr.bsize > MAX_BSIZE) {
- errno = EINVAL;
- return (NULL);
- }
- }
- if (info->ffactor)
- hashp->hdr.ffactor = info->ffactor;
- if (info->hash)
- hashp->hash = info->hash;
- if (info->lorder) {
- if ((info->lorder != DB_BIG_ENDIAN) &&
- (info->lorder != DB_LITTLE_ENDIAN)) {
- errno = EINVAL;
- return (NULL);
- }
- hashp->hdr.lorder = info->lorder;
- }
- }
- return (hashp);
-}
-
-/*
- * Returns 0 on No Error
- */
-static int32_t
-init_htab(hashp, nelem)
- HTAB *hashp;
- int32_t nelem;
-{
- int32_t l2, nbuckets;
-
- /*
- * Divide number of elements by the fill factor and determine a
- * desired number of buckets. Allocate space for the next greater
- * power of two number of buckets.
- */
- nelem = (nelem - 1) / hashp->hdr.ffactor + 1;
-
- l2 = __log2(MAX(nelem, 2));
- nbuckets = 1 << l2;
-
- hashp->hdr.spares[l2] = l2 + 1;
- hashp->hdr.spares[l2 + 1] = l2 + 1;
- hashp->hdr.ovfl_point = l2;
- hashp->hdr.last_freed = 2;
-
- hashp->hdr.max_bucket = hashp->hdr.low_mask = nbuckets - 1;
- hashp->hdr.high_mask = (nbuckets << 1) - 1;
-
- /*
- * The number of header pages is the size of the header divided by
- * the amount of freespace on header pages (the page size - the
- * size of 1 integer where the length of the header info on that
- * page is stored) plus another page if it didn't divide evenly.
- */
- hashp->hdr.hdrpages =
- (sizeof(HASHHDR) / (hashp->hdr.bsize - HEADER_OVERHEAD)) +
- (((sizeof(HASHHDR) % (hashp->hdr.bsize - HEADER_OVERHEAD)) == 0)
- ? 0 : 1);
-
- /* Create pages for these buckets */
- /*
- for (i = 0; i <= hashp->hdr.max_bucket; i++) {
- if (__new_page(hashp, (u_int32_t)i, A_BUCKET) != 0)
- return (-1);
- }
- */
-
- /* First bitmap page is at: splitpoint l2 page offset 1 */
- if (__ibitmap(hashp, OADDR_OF(l2, 1), l2 + 1, 0))
- return (-1);
-
- return (0);
-}
-
-/*
- * Functions to get/put hash header. We access the file directly.
- */
-static u_int32_t
-hget_header(hashp, page_size)
- HTAB *hashp;
- u_int32_t page_size;
-{
- u_int32_t num_copied, i;
- u_int8_t *hdr_dest;
-
- num_copied = 0;
- i = 0;
-
- hdr_dest = (u_int8_t *)&hashp->hdr;
-
- /*
- * XXX
- * This should not be printing to stderr on a "normal" error case.
- */
- lseek(hashp->fp, 0, SEEK_SET);
- num_copied = read(hashp->fp, hdr_dest, sizeof(HASHHDR));
- if (num_copied != sizeof(HASHHDR)) {
- fprintf(stderr, "hash: could not retrieve header");
- return (0);
- }
-#if DB_BYTE_ORDER == DB_LITTLE_ENDIAN
- swap_header(hashp);
-#endif
- return (num_copied);
-}
-
-static void
-hput_header(hashp)
- HTAB *hashp;
-{
- HASHHDR *whdrp;
-#if DB_BYTE_ORDER == DB_LITTLE_ENDIAN
- HASHHDR whdr;
-#endif
- u_int32_t num_copied, i;
-
- num_copied = i = 0;
-
- whdrp = &hashp->hdr;
-#if DB_BYTE_ORDER == DB_LITTLE_ENDIAN
- whdrp = &whdr;
- swap_header_copy(&hashp->hdr, whdrp);
-#endif
-
- lseek(hashp->fp, 0, SEEK_SET);
- num_copied = write(hashp->fp, whdrp, sizeof(HASHHDR));
- if (num_copied != sizeof(HASHHDR))
- (void)fprintf(stderr, "hash: could not write hash header");
- return;
-}
-
-/********************** DESTROY/CLOSE ROUTINES ************************/
-
-/*
- * Flushes any changes to the file if necessary and destroys the hashp
- * structure, freeing all allocated space.
- */
-static int32_t
-hdestroy(hashp)
- HTAB *hashp;
-{
- int32_t save_errno;
-
- save_errno = 0;
-
-#ifdef HASH_STATISTICS
- { int i;
- (void)fprintf(stderr, "hdestroy: accesses %ld collisions %ld\n",
- hash_accesses, hash_collisions);
- (void)fprintf(stderr,
- "hdestroy: expansions %ld\n", hash_expansions);
- (void)fprintf(stderr,
- "hdestroy: overflows %ld\n", hash_overflows);
- (void)fprintf(stderr,
- "hdestroy: big key/data pages %ld\n", hash_bigpages);
- (void)fprintf(stderr,
- "keys %ld maxp %d\n", hashp->hdr.nkeys, hashp->hdr.max_bucket);
-
- for (i = 0; i < NCACHED; i++)
- (void)fprintf(stderr,
- "spares[%d] = %d\n", i, hashp->hdr.spares[i]);
- }
-#endif
-
- if (flush_meta(hashp) && !save_errno)
- save_errno = errno;
-
- /* Free the split page */
- if (hashp->split_buf)
- free(hashp->split_buf);
-
- /* Free the big key and big data returns */
- if (hashp->bigkey_buf)
- free(hashp->bigkey_buf);
- if (hashp->bigdata_buf)
- free(hashp->bigdata_buf);
-
- /* XXX This should really iterate over the cursor queue, but
- it's not clear how to do that, and the only cursor a hash
- table ever creates is the one used by hash_seq(). Passing
- NULL as the first arg is also a kludge, but I know that
- it's never used, so I do it. The intent is to plug the
- memory leak. Correctness can come later. */
-
- if (hashp->seq_cursor)
- hashp->seq_cursor->delete(NULL, hashp->seq_cursor, 0);
-
- /* shut down mpool */
- mpool_sync(hashp->mp);
- mpool_close(hashp->mp);
-
- if (hashp->fp != -1)
- (void)close(hashp->fp);
-
- /*
- * *** This may cause problems if hashp->fname is set in any case
- * other than the case that we are generating a temporary file name.
- * Note that the new version of mpool should support temporary
- * files within mpool itself.
- */
- if (hashp->fname && !hashp->save_file) {
-#ifdef DEBUG
- fprintf(stderr, "Unlinking file %s.\n", hashp->fname);
-#endif
- /* we need to chmod the file to allow it to be deleted... */
- chmod(hashp->fname, 0700);
- unlink(hashp->fname);
- /* destroy the temporary name */
- tmpnam(NULL);
- }
- free(hashp);
-
- if (save_errno) {
- errno = save_errno;
- return (ERROR);
- }
- return (SUCCESS);
-}
-
-/*
- * Write modified pages to disk
- *
- * Returns:
- * 0 == OK
- * -1 ERROR
- */
-static int32_t
-hash_sync(dbp, flags)
- const DB *dbp;
- u_int32_t flags;
-{
- HTAB *hashp;
-
- hashp = (HTAB *)dbp->internal;
-
- /*
- * XXX
- * Check success/failure conditions.
- */
- return (flush_meta(hashp) || mpool_sync(hashp->mp));
-}
-
-/*
- * Returns:
- * 0 == OK
- * -1 indicates that errno should be set
- */
-static int32_t
-flush_meta(hashp)
- HTAB *hashp;
-{
- int32_t i;
-
- if (!hashp->save_file)
- return (0);
- hashp->hdr.magic = HASHMAGIC;
- hashp->hdr.version = HASHVERSION;
- hashp->hdr.h_charkey = hashp->hash(CHARKEY, sizeof(CHARKEY));
-
- /* write out metadata */
- hput_header(hashp);
-
- for (i = 0; i < NCACHED; i++)
- if (hashp->mapp[i]) {
- if (__put_page(hashp,
- (PAGE16 *)hashp->mapp[i], A_BITMAP, 1))
- return (-1);
- hashp->mapp[i] = NULL;
- }
- return (0);
-}
-
-/*******************************SEARCH ROUTINES *****************************/
-/*
- * All the access routines return
- *
- * Returns:
- * 0 on SUCCESS
- * 1 to indicate an external ERROR (i.e. key not found, etc)
- * -1 to indicate an internal ERROR (i.e. out of memory, etc)
- */
-
-/* *** make sure this is true! */
-
-static int32_t
-hash_get(dbp, key, data, flag)
- const DB *dbp;
- const DBT *key;
- DBT *data;
- u_int32_t flag;
-{
- HTAB *hashp;
-
- hashp = (HTAB *)dbp->internal;
- if (flag) {
- hashp->local_errno = errno = EINVAL;
- return (ERROR);
- }
- return (hash_access(hashp, HASH_GET, key, data));
-}
-
-static int32_t
-hash_put(dbp, key, data, flag)
- const DB *dbp;
- DBT *key;
- const DBT *data;
- u_int32_t flag;
-{
- HTAB *hashp;
-
- hashp = (HTAB *)dbp->internal;
- if (flag && flag != R_NOOVERWRITE) {
- hashp->local_errno = errno = EINVAL;
- return (ERROR);
- }
- if ((hashp->flags & O_ACCMODE) == O_RDONLY) {
- hashp->local_errno = errno = EPERM;
- return (ERROR);
- }
- return (hash_access(hashp, flag == R_NOOVERWRITE ?
- HASH_PUTNEW : HASH_PUT, key, (DBT *)data));
-}
-
-static int32_t
-hash_delete(dbp, key, flag)
- const DB *dbp;
- const DBT *key;
- u_int32_t flag; /* Ignored */
-{
- HTAB *hashp;
-
- hashp = (HTAB *)dbp->internal;
- if (flag) {
- hashp->local_errno = errno = EINVAL;
- return (ERROR);
- }
- if ((hashp->flags & O_ACCMODE) == O_RDONLY) {
- hashp->local_errno = errno = EPERM;
- return (ERROR);
- }
-
- return (hash_access(hashp, HASH_DELETE, key, NULL));
-}
-
-/*
- * Assume that hashp has been set in wrapper routine.
- */
-static int32_t
-hash_access(hashp, action, key, val)
- HTAB *hashp;
- ACTION action;
- const DBT *key;
- DBT *val;
-{
- DBT page_key, page_val;
- CURSOR cursor;
- ITEM_INFO item_info;
- u_int32_t bucket;
- u_int32_t num_items;
-
-#ifdef HASH_STATISTICS
- hash_accesses++;
-#endif
-
- num_items = 0;
-
- /*
- * Set up item_info so that we're looking for space to add an item
- * as we cycle through the pages looking for the key.
- */
- if (action == HASH_PUT || action == HASH_PUTNEW) {
- if (ISBIG(key->size + val->size, hashp))
- item_info.seek_size = PAIR_OVERHEAD;
- else
- item_info.seek_size = key->size + val->size;
- } else
- item_info.seek_size = 0;
- item_info.seek_found_page = 0;
-
- bucket = __call_hash(hashp, (int8_t *)key->data, key->size);
-
- cursor.pagep = NULL;
- __get_item_reset(hashp, &cursor);
-
- cursor.bucket = bucket;
- while (1) {
- __get_item_next(hashp, &cursor, &page_key, &page_val, &item_info);
- if (item_info.status == ITEM_ERROR)
- return (ABNORMAL);
- if (item_info.status == ITEM_NO_MORE)
- break;
- num_items++;
- if (item_info.key_off == BIGPAIR) {
- /*
- * !!!
- * 0 is a valid index.
- */
- if (__find_bigpair(hashp, &cursor, (int8_t *)key->data,
- key->size) > 0)
- goto found;
- } else if (key->size == page_key.size &&
- !memcmp(key->data, page_key.data, key->size))
- goto found;
- }
-#ifdef HASH_STATISTICS
- hash_collisions++;
-#endif
- __get_item_done(hashp, &cursor);
-
- /*
- * At this point, item_info will list either the last page in
- * the chain, or the last page in the chain plus a pgno for where
- * to find the first page in the chain with space for the
- * item we wish to add.
- */
-
- /* Not found */
- switch (action) {
- case HASH_PUT:
- case HASH_PUTNEW:
- if (__addel(hashp, &item_info, key, val, num_items, 0))
- return (ERROR);
- break;
- case HASH_GET:
- case HASH_DELETE:
- default:
- return (ABNORMAL);
- }
-
- if (item_info.caused_expand)
- __expand_table(hashp);
- return (SUCCESS);
-
-found: __get_item_done(hashp, &cursor);
-
- switch (action) {
- case HASH_PUTNEW:
- /* mpool_put(hashp->mp, pagep, 0); */
- return (ABNORMAL);
- case HASH_GET:
- if (item_info.key_off == BIGPAIR) {
- if (__big_return(hashp, &item_info, val, 0))
- return (ERROR);
- } else {
- val->data = page_val.data;
- val->size = page_val.size;
- }
- /* *** data may not be available! */
- break;
- case HASH_PUT:
- if (__delpair(hashp, &cursor, &item_info) ||
- __addel(hashp, &item_info, key, val, UNKNOWN, 0))
- return (ERROR);
- __get_item_done(hashp, &cursor);
- if (item_info.caused_expand)
- __expand_table(hashp);
- break;
- case HASH_DELETE:
- if (__delpair(hashp, &cursor, &item_info))
- return (ERROR);
- break;
- default:
- abort();
- }
- return (SUCCESS);
-}
-
-/* ****************** CURSORS ********************************** */
-CURSOR *
-__cursor_creat(dbp)
- const DB *dbp;
-{
- CURSOR *new_curs;
- HTAB *hashp;
-
- new_curs = (CURSOR *)malloc(sizeof(struct cursor_t));
- if (!new_curs)
- return NULL;
- new_curs->internal =
- (struct item_info *)malloc(sizeof(struct item_info));
- if (!new_curs->internal) {
- free(new_curs);
- return NULL;
- }
- new_curs->get = cursor_get;
- new_curs->delete = cursor_delete;
-
- new_curs->bucket = 0;
- new_curs->pgno = INVALID_PGNO;
- new_curs->ndx = 0;
- new_curs->pgndx = 0;
- new_curs->pagep = NULL;
-
- /* place onto queue of cursors */
- hashp = (HTAB *)dbp->internal;
- TAILQ_INSERT_TAIL(&hashp->curs_queue, new_curs, queue);
-
- return new_curs;
-}
-
-static int32_t
-cursor_get(dbp, cursorp, key, val, flags)
- const DB *dbp;
- CURSOR *cursorp;
- DBT *key, *val;
- u_int32_t flags;
-{
- HTAB *hashp;
- ITEM_INFO item_info;
-
- hashp = (HTAB *)dbp->internal;
-
- if (flags && flags != R_FIRST && flags != R_NEXT) {
- hashp->local_errno = errno = EINVAL;
- return (ERROR);
- }
-#ifdef HASH_STATISTICS
- hash_accesses++;
-#endif
-
- item_info.seek_size = 0;
-
- if (flags == R_FIRST)
- __get_item_first(hashp, cursorp, key, val, &item_info);
- else
- __get_item_next(hashp, cursorp, key, val, &item_info);
-
- /*
- * This needs to be changed around. As is, get_item_next advances
- * the pointers on the page but this function actually advances
- * bucket pointers. This works, since the only other place we
- * use get_item_next is in hash_access which only deals with one
- * bucket at a time. However, there is the problem that certain other
- * functions (such as find_bigpair and delpair) depend on the
- * pgndx member of the cursor. Right now, they are using pngdx - 1
- * since indices refer to the __next__ item that is to be fetched
- * from the page. This is ugly, as you may have noticed, whoever
- * you are. The best solution would be to depend on item_infos to
- * deal with _current_ information, and have the cursors only
- * deal with _next_ information. In that scheme, get_item_next
- * would also advance buckets. Version 3...
- */
-
-
- /*
- * Must always enter this loop to do error handling and
- * check for big key/data pair.
- */
- while (1) {
- if (item_info.status == ITEM_OK) {
- if (item_info.key_off == BIGPAIR &&
- __big_keydata(hashp, cursorp->pagep, key, val,
- item_info.pgndx))
- return (ABNORMAL);
-
- break;
- } else if (item_info.status != ITEM_NO_MORE)
- return (ABNORMAL);
-
- __put_page(hashp, cursorp->pagep, A_RAW, 0);
- cursorp->ndx = cursorp->pgndx = 0;
- cursorp->bucket++;
- cursorp->pgno = INVALID_PGNO;
- cursorp->pagep = NULL;
- if (cursorp->bucket > hashp->hdr.max_bucket)
- return (ABNORMAL);
- __get_item_next(hashp, cursorp, key, val, &item_info);
- }
-
- __get_item_done(hashp, cursorp);
- return (0);
-}
-
-static int32_t
-cursor_delete(dbp, cursor, flags)
- const DB *dbp;
- CURSOR *cursor;
- u_int32_t flags;
-{
- /* XXX this is empirically determined, so it might not be completely
- correct, but it seems to work. At the very least it fixes
- a memory leak */
-
- free(cursor->internal);
- free(cursor);
-
- return (0);
-}
-
-static int32_t
-hash_seq(dbp, key, val, flag)
- const DB *dbp;
- DBT *key, *val;
- u_int32_t flag;
-{
- HTAB *hashp;
-
- /*
- * Seq just uses the default cursor to go sequecing through the
- * database. Note that the default cursor is the first in the list.
- */
-
- hashp = (HTAB *)dbp->internal;
- if (!hashp->seq_cursor)
- hashp->seq_cursor = __cursor_creat(dbp);
-
- return (hashp->seq_cursor->get(dbp, hashp->seq_cursor, key, val, flag));
-}
-
-/********************************* UTILITIES ************************/
-
-/*
- * Returns:
- * 0 ==> OK
- * -1 ==> Error
- */
-int32_t
-__expand_table(hashp)
- HTAB *hashp;
-{
- u_int32_t old_bucket, new_bucket;
- int32_t spare_ndx;
-
-#ifdef HASH_STATISTICS
- hash_expansions++;
-#endif
- new_bucket = ++hashp->hdr.max_bucket;
- old_bucket = (hashp->hdr.max_bucket & hashp->hdr.low_mask);
-
- /* Get a page for this new bucket */
- if (__new_page(hashp, new_bucket, A_BUCKET) != 0)
- return (-1);
-
- /*
- * If the split point is increasing (hdr.max_bucket's log base 2
- * increases), we need to copy the current contents of the spare
- * split bucket to the next bucket.
- */
- spare_ndx = __log2(hashp->hdr.max_bucket + 1);
- if (spare_ndx > hashp->hdr.ovfl_point) {
- hashp->hdr.spares[spare_ndx] = hashp->hdr.spares[hashp->hdr.ovfl_point];
- hashp->hdr.ovfl_point = spare_ndx;
- }
- if (new_bucket > hashp->hdr.high_mask) {
- /* Starting a new doubling */
- hashp->hdr.low_mask = hashp->hdr.high_mask;
- hashp->hdr.high_mask = new_bucket | hashp->hdr.low_mask;
- }
- if (BUCKET_TO_PAGE(new_bucket) > MAX_PAGES(hashp)) {
- fprintf(stderr, "hash: Cannot allocate new bucket. Pages exhausted.\n");
- return (-1);
- }
- /* Relocate records to the new bucket */
- return (__split_page(hashp, old_bucket, new_bucket));
-}
-
-u_int32_t
-__call_hash(hashp, k, len)
- HTAB *hashp;
- int8_t *k;
- int32_t len;
-{
- int32_t n, bucket;
-
- n = hashp->hash(k, len);
- bucket = n & hashp->hdr.high_mask;
- if (bucket > hashp->hdr.max_bucket)
- bucket = bucket & hashp->hdr.low_mask;
- return (bucket);
-}
-
-#if DB_BYTE_ORDER == DB_LITTLE_ENDIAN
-/*
- * Hashp->hdr needs to be byteswapped.
- */
-static void
-swap_header_copy(srcp, destp)
- HASHHDR *srcp, *destp;
-{
- int32_t i;
-
- P_32_COPY(srcp->magic, destp->magic);
- P_32_COPY(srcp->version, destp->version);
- P_32_COPY(srcp->lorder, destp->lorder);
- P_32_COPY(srcp->bsize, destp->bsize);
- P_32_COPY(srcp->bshift, destp->bshift);
- P_32_COPY(srcp->ovfl_point, destp->ovfl_point);
- P_32_COPY(srcp->last_freed, destp->last_freed);
- P_32_COPY(srcp->max_bucket, destp->max_bucket);
- P_32_COPY(srcp->high_mask, destp->high_mask);
- P_32_COPY(srcp->low_mask, destp->low_mask);
- P_32_COPY(srcp->ffactor, destp->ffactor);
- P_32_COPY(srcp->nkeys, destp->nkeys);
- P_32_COPY(srcp->hdrpages, destp->hdrpages);
- P_32_COPY(srcp->h_charkey, destp->h_charkey);
- for (i = 0; i < NCACHED; i++) {
- P_32_COPY(srcp->spares[i], destp->spares[i]);
- P_16_COPY(srcp->bitmaps[i], destp->bitmaps[i]);
- }
-}
-
-static void
-swap_header(hashp)
- HTAB *hashp;
-{
- HASHHDR *hdrp;
- int32_t i;
-
- hdrp = &hashp->hdr;
-
- M_32_SWAP(hdrp->magic);
- M_32_SWAP(hdrp->version);
- M_32_SWAP(hdrp->lorder);
- M_32_SWAP(hdrp->bsize);
- M_32_SWAP(hdrp->bshift);
- M_32_SWAP(hdrp->ovfl_point);
- M_32_SWAP(hdrp->last_freed);
- M_32_SWAP(hdrp->max_bucket);
- M_32_SWAP(hdrp->high_mask);
- M_32_SWAP(hdrp->low_mask);
- M_32_SWAP(hdrp->ffactor);
- M_32_SWAP(hdrp->nkeys);
- M_32_SWAP(hdrp->hdrpages);
- M_32_SWAP(hdrp->h_charkey);
- for (i = 0; i < NCACHED; i++) {
- M_32_SWAP(hdrp->spares[i]);
- M_16_SWAP(hdrp->bitmaps[i]);
- }
-}
-#endif /* DB_BYTE_ORDER == DB_LITTLE_ENDIAN */
diff --git a/src/util/db2/hash/hash.c.patch b/src/util/db2/hash/hash.c.patch
deleted file mode 100644
index b72cc0d26d..0000000000
--- a/src/util/db2/hash/hash.c.patch
+++ /dev/null
@@ -1,109 +0,0 @@
-*** /tmp/,RCSt1a21714 Wed Apr 3 11:49:15 1996
---- hash.c Wed Apr 3 08:43:04 1996
-***************
-*** 399,405
- /* Create pages for these buckets */
- /*
- for (i = 0; i <= hashp->hdr.max_bucket; i++) {
-! if (__new_page(hashp, i, A_BUCKET) != 0)
- return (-1);
- }
- */
-
---- 399,405 -----
- /* Create pages for these buckets */
- /*
- for (i = 0; i <= hashp->hdr.max_bucket; i++) {
-! if (__new_page(hashp, (u_int32_t)i, A_BUCKET) != 0)
- return (-1);
- }
- */
-***************
-*** 560,567
- * XXX
- * Check success/failure conditions.
- */
-! mpool_sync(hashp->mp);
-! return (0);
- }
-
- /*
-
---- 560,566 -----
- * XXX
- * Check success/failure conditions.
- */
-! return (flush_meta(hashp) || mpool_sync(hashp->mp));
- }
-
- /*
-***************
-*** 585,591
- hput_header(hashp);
-
- for (i = 0; i < NCACHED; i++)
-! if (hashp->mapp[i])
- if (__put_page(hashp,
- (PAGE16 *)hashp->mapp[i], A_BITMAP, 1))
- return (-1);
-
---- 584,590 -----
- hput_header(hashp);
-
- for (i = 0; i < NCACHED; i++)
-! if (hashp->mapp[i]) {
- if (__put_page(hashp,
- (PAGE16 *)hashp->mapp[i], A_BITMAP, 1))
- return (-1);
-***************
-*** 589,594
- if (__put_page(hashp,
- (PAGE16 *)hashp->mapp[i], A_BITMAP, 1))
- return (-1);
- return (0);
- }
-
-
---- 588,595 -----
- if (__put_page(hashp,
- (PAGE16 *)hashp->mapp[i], A_BITMAP, 1))
- return (-1);
-+ hashp->mapp[i] = NULL;
-+ }
- return (0);
- }
-
-***************
-*** 726,732
- #ifdef HASH_STATISTICS
- hash_collisions++;
- #endif
--
- __get_item_done(hashp, &cursor);
-
- /*
-
---- 727,732 -----
- #ifdef HASH_STATISTICS
- hash_collisions++;
- #endif
- __get_item_done(hashp, &cursor);
-
- /*
-***************
-*** 773,778
- if (__delpair(hashp, &cursor, &item_info) ||
- __addel(hashp, &item_info, key, val, UNKNOWN, 0))
- return (ERROR);
- if (item_info.caused_expand)
- __expand_table(hashp);
- break;
-
---- 773,779 -----
- if (__delpair(hashp, &cursor, &item_info) ||
- __addel(hashp, &item_info, key, val, UNKNOWN, 0))
- return (ERROR);
-+ __get_item_done(hashp, &cursor);
- if (item_info.caused_expand)
- __expand_table(hashp);
- break;
diff --git a/src/util/db2/hash/hash.h b/src/util/db2/hash/hash.h
deleted file mode 100644
index b202fc9f22..0000000000
--- a/src/util/db2/hash/hash.h
+++ /dev/null
@@ -1,196 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Margo Seltzer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)hash.h 8.4 (Berkeley) 11/2/95
- */
-
-#include "mpool.h"
-#include "db-queue.h"
-
-/* Operations */
-typedef enum {
- HASH_GET, HASH_PUT, HASH_PUTNEW, HASH_DELETE, HASH_FIRST, HASH_NEXT
-} ACTION;
-
-/* cursor structure */
-typedef struct cursor_t {
- TAILQ_ENTRY(cursor_t) queue;
- int (*get) __P((const DB *, struct cursor_t *, DBT *, DBT *, \
- u_int32_t));
- int (*delete) __P((const DB *, struct cursor_t *, u_int32_t));
- db_pgno_t bucket;
- db_pgno_t pgno;
- indx_t ndx;
- indx_t pgndx;
- u_int16_t *pagep;
- void *internal;
-} CURSOR;
-
-
-#define IS_BUCKET(X) ((X) & BUF_BUCKET)
-#define IS_VALID(X) (!((X) & BUF_INVALID))
-
-/* Hash Table Information */
-typedef struct hashhdr { /* Disk resident portion */
- int32_t magic; /* Magic NO for hash tables */
- int32_t version; /* Version ID */
- int32_t lorder; /* Byte Order */
- int32_t bsize; /* Bucket/Page Size */
- int32_t bshift; /* Bucket shift */
- int32_t ovfl_point; /* Where overflow pages are being allocated */
- int32_t last_freed; /* Last overflow page freed */
- int32_t max_bucket; /* ID of Maximum bucket in use */
- int32_t high_mask; /* Mask to modulo into entire table */
- int32_t low_mask; /* Mask to modulo into lower half of table */
- int32_t ffactor; /* Fill factor */
- int32_t nkeys; /* Number of keys in hash table */
- int32_t hdrpages; /* Size of table header */
- int32_t h_charkey; /* value of hash(CHARKEY) */
-#define NCACHED 32 /* number of bit maps and spare points */
- int32_t spares[NCACHED];/* spare pages for overflow */
- u_int16_t bitmaps[NCACHED]; /* address of overflow page bitmaps */
-} HASHHDR;
-
-typedef struct htab { /* Memory resident data structure */
- TAILQ_HEAD(_cursor_queue, cursor_t) curs_queue;
- HASHHDR hdr; /* Header */
- u_int32_t (*hash) __P((const void *, size_t)); /* Hash Function */
- int32_t flags; /* Flag values */
- int32_t fp; /* File pointer */
- const char *fname; /* File path */
- u_int8_t *bigdata_buf; /* Temporary Buffer for BIG data */
- u_int8_t *bigkey_buf; /* Temporary Buffer for BIG keys */
- u_int16_t *split_buf; /* Temporary buffer for splits */
- CURSOR *seq_cursor; /* Cursor used for hash_seq */
- int32_t local_errno; /* Error Number -- for DBM compatability */
- int32_t new_file; /* Indicates if fd is backing store or no */
- int32_t save_file; /* Indicates whether we need to flush file at
- * exit */
- u_int32_t *mapp[NCACHED];/* Pointers to page maps */
- int32_t nmaps; /* Initial number of bitmaps */
- MPOOL *mp; /* mpool for buffer management */
-} HTAB;
-
-/*
- * Constants
- */
-#define MAX_BSIZE 65536 /* 2^16 */
-#define MIN_BUFFERS 6
-#define MINHDRSIZE 512
-#define DEF_CACHESIZE 65536
-#define DEF_BUCKET_SHIFT 12 /* log2(BUCKET) */
-#define DEF_BUCKET_SIZE (1<<DEF_BUCKET_SHIFT)
-#define DEF_SEGSIZE_SHIFT 8 /* log2(SEGSIZE) */
-#define DEF_SEGSIZE (1<<DEF_SEGSIZE_SHIFT)
-#define DEF_DIRSIZE 256
-#define DEF_FFACTOR 65536
-#define MIN_FFACTOR 4
-#define SPLTMAX 8
-#define CHARKEY "%$sniglet^&"
-#define NUMKEY 1038583
-#define BYTE_SHIFT 3
-#define INT32_T_TO_BYTE 2
-#define INT32_T_BYTE_SHIFT 5
-#define ALL_SET ((u_int32_t)0xFFFFFFFF)
-#define ALL_CLEAR 0
-
-#define PTROF(X) ((BUFHEAD *)((ptr_t)(X)&~0x3))
-#define ISMOD(X) ((ptr_t)(X)&0x1)
-#define DOMOD(X) ((X) = (int8_t *)((ptr_t)(X)|0x1))
-#define ISDISK(X) ((ptr_t)(X)&0x2)
-#define DODISK(X) ((X) = (int8_t *)((ptr_t)(X)|0x2))
-
-#define BITS_PER_MAP 32
-
-/* Given the address of the beginning of a big map, clear/set the nth bit */
-#define CLRBIT(A, N) ((A)[(N)/BITS_PER_MAP] &= ~(1<<((N)%BITS_PER_MAP)))
-#define SETBIT(A, N) ((A)[(N)/BITS_PER_MAP] |= (1<<((N)%BITS_PER_MAP)))
-#define ISSET(A, N) ((A)[(N)/BITS_PER_MAP] & (1<<((N)%BITS_PER_MAP)))
-
-/* Overflow management */
-/*
- * Overflow page numbers are allocated per split point. At each doubling of
- * the table, we can allocate extra pages. So, an overflow page number has
- * the top 5 bits indicate which split point and the lower 11 bits indicate
- * which page at that split point is indicated (pages within split points are
- * numberered starting with 1).
- */
-
-#define SPLITSHIFT 11
-#define SPLITMASK 0x7FF
-#define SPLITNUM(N) (((u_int32_t)(N)) >> SPLITSHIFT)
-#define OPAGENUM(N) ((N) & SPLITMASK)
-#define OADDR_OF(S,O) ((u_int32_t)((u_int32_t)(S) << SPLITSHIFT) + (O))
-
-#define BUCKET_TO_PAGE(B) \
- ((B) + hashp->hdr.hdrpages + ((B) \
- ? hashp->hdr.spares[__log2((B)+1)-1] : 0))
-#define OADDR_TO_PAGE(B) \
- (BUCKET_TO_PAGE ( (1 << SPLITNUM((B))) -1 ) + OPAGENUM((B)))
-
-#define POW2(N) (1 << (N))
-
-#define MAX_PAGES(H) (DB_OFF_T_MAX / (H)->hdr.bsize)
-
-/* Shorthands for accessing structure */
-#define METADATA_PGNO 0
-#define SPLIT_PGNO 0xFFFF
-
-typedef struct item_info {
- db_pgno_t pgno;
- db_pgno_t bucket;
- indx_t ndx;
- indx_t pgndx;
- u_int8_t status;
- int32_t seek_size;
- db_pgno_t seek_found_page;
- indx_t key_off;
- indx_t data_off;
- u_int8_t caused_expand;
-} ITEM_INFO;
-
-
-#define ITEM_ERROR 0
-#define ITEM_OK 1
-#define ITEM_NO_MORE 2
-
-#define ITEM_GET_FIRST 0
-#define ITEM_GET_NEXT 1
-#define ITEM_GET_RESET 2
-#define ITEM_GET_DONE 3
-#define ITEM_GET_N 4
-
-#define UNKNOWN 0xffffffff /* for num_items */
-#define NO_EXPAND 0xfffffffe
diff --git a/src/util/db2/hash/hash_bigkey.c b/src/util/db2/hash/hash_bigkey.c
deleted file mode 100644
index 06210a57cc..0000000000
--- a/src/util/db2/hash/hash_bigkey.c
+++ /dev/null
@@ -1,483 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Margo Seltzer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)hash_bigkey.c 8.5 (Berkeley) 11/2/95";
-#endif /* LIBC_SCCS and not lint */
-
-/*
- * PACKAGE: hash
- * DESCRIPTION:
- * Big key/data handling for the hashing package.
- *
- * ROUTINES:
- * External
- * __big_keydata
- * __big_split
- * __big_insert
- * __big_return
- * __big_delete
- * __find_last_page
- * Internal
- * collect_key
- * collect_data
- */
-#include <sys/types.h>
-
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef DEBUG
-#include <assert.h>
-#endif
-
-#include "db-int.h"
-#include "hash.h"
-#include "page.h"
-#include "extern.h"
-
-static int32_t collect_key __P((HTAB *, PAGE16 *, int32_t, db_pgno_t *));
-static int32_t collect_data __P((HTAB *, PAGE16 *, int32_t));
-
-/*
- * Big_insert
- *
- * You need to do an insert and the key/data pair is greater than
- * MINFILL * the bucket size
- *
- * Returns:
- * 0 ==> OK
- * -1 ==> ERROR
- */
-int32_t
-__big_insert(hashp, pagep, key, val)
- HTAB *hashp;
- PAGE16 *pagep;
- const DBT *key, *val;
-{
- size_t key_size, val_size;
- indx_t key_move_bytes, val_move_bytes;
- int8_t *key_data, *val_data, base_page;
-
- key_data = (int8_t *)key->data;
- key_size = key->size;
- val_data = (int8_t *)val->data;
- val_size = val->size;
-
- NUM_ENT(pagep) = NUM_ENT(pagep) + 1;
-
- for (base_page = 1; key_size + val_size;) {
- /* Add a page! */
- pagep =
- __add_bigpage(hashp, pagep, NUM_ENT(pagep) - 1, base_page);
- if (!pagep)
- return (-1);
-
- /* There's just going to be one entry on this page. */
- NUM_ENT(pagep) = 1;
-
- /* Move the key's data. */
- key_move_bytes = MIN(FREESPACE(pagep), key_size);
- /* Mark the page as to how much key & data is on this page. */
- BIGKEYLEN(pagep) = key_move_bytes;
- val_move_bytes =
- MIN(FREESPACE(pagep) - key_move_bytes, val_size);
- BIGDATALEN(pagep) = val_move_bytes;
-
- /* Note big pages build beginning --> end, not vice versa. */
- if (key_move_bytes)
- memmove(BIGKEY(pagep), key_data, key_move_bytes);
- if (val_move_bytes)
- memmove(BIGDATA(pagep), val_data, val_move_bytes);
-
- key_size -= key_move_bytes;
- key_data += key_move_bytes;
- val_size -= val_move_bytes;
- val_data += val_move_bytes;
-
- base_page = 0;
- }
- __put_page(hashp, pagep, A_RAW, 1);
- return (0);
-}
-
-/*
- * Called when we need to delete a big pair.
- *
- * Returns:
- * 0 => OK
- * -1 => ERROR
- */
-int32_t
-#ifdef __STDC__
-__big_delete(HTAB *hashp, PAGE16 *pagep, indx_t ndx)
-#else
-__big_delete(hashp, pagep, ndx)
- HTAB *hashp;
- PAGE16 *pagep;
- u_int32_t ndx; /* Index of big pair on base page. */
-#endif
-{
- PAGE16 *last_pagep;
-
- /* Get first page with big key/data. */
- pagep = __get_page(hashp, OADDR_TO_PAGE(DATA_OFF(pagep, ndx)), A_RAW);
- if (!pagep)
- return (-1);
-
- /*
- * Traverse through the pages, freeing the previous one (except
- * the first) at each new page.
- */
- while (NEXT_PGNO(pagep) != INVALID_PGNO) {
- last_pagep = pagep;
- pagep = __get_page(hashp, NEXT_PGNO(pagep), A_RAW);
- if (!pagep)
- return (-1);
- __delete_page(hashp, last_pagep, A_OVFL);
- }
-
- /* Free the last page in the chain. */
- __delete_page(hashp, pagep, A_OVFL);
- return (0);
-}
-
-/*
- * Given a key, indicates whether the big key at cursorp matches the
- * given key.
- *
- * Returns:
- * 1 = Found!
- * 0 = Key not found
- * -1 error
- */
-int32_t
-__find_bigpair(hashp, cursorp, key, size)
- HTAB *hashp;
- CURSOR *cursorp;
- int8_t *key;
- int32_t size;
-{
- PAGE16 *pagep, *hold_pagep;
- db_pgno_t next_pgno;
- int32_t ksize;
- u_int16_t bytes;
- int8_t *kkey;
-
- ksize = size;
- kkey = key;
- bytes = 0;
-
- hold_pagep = NULL;
- /* Chances are, hashp->cpage is the base page. */
- if (cursorp->pagep)
- pagep = hold_pagep = cursorp->pagep;
- else {
- pagep = __get_page(hashp, cursorp->pgno, A_RAW);
- if (!pagep)
- return (-1);
- }
-
- /*
- * Now, get the first page with the big stuff on it.
- *
- * XXX
- * KLUDGE: we know that cursor is looking at the _next_ item, so
- * we have to look at pgndx - 1.
- */
- next_pgno = OADDR_TO_PAGE(DATA_OFF(pagep, (cursorp->pgndx - 1)));
- if (!hold_pagep)
- __put_page(hashp, pagep, A_RAW, 0);
- pagep = __get_page(hashp, next_pgno, A_RAW);
- if (!pagep)
- return (-1);
-
- /* While there are both keys to compare. */
- while ((ksize > 0) && (BIGKEYLEN(pagep))) {
- if (ksize < KEY_OFF(pagep, 0) ||
- memcmp(BIGKEY(pagep), kkey, BIGKEYLEN(pagep))) {
- __put_page(hashp, pagep, A_RAW, 0);
- return (0);
- }
- kkey += BIGKEYLEN(pagep);
- ksize -= BIGKEYLEN(pagep);
- if (NEXT_PGNO(pagep) != INVALID_PGNO) {
- next_pgno = NEXT_PGNO(pagep);
- __put_page(hashp, pagep, A_RAW, 0);
- pagep = __get_page(hashp, next_pgno, A_RAW);
- if (!pagep)
- return (-1);
- }
- }
- __put_page(hashp, pagep, A_RAW, 0);
-#ifdef DEBUG
- assert(ksize >= 0);
-#endif
- if (ksize != 0) {
-#ifdef HASH_STATISTICS
- ++hash_collisions;
-#endif
- return (0);
- } else
- return (1);
-}
-
-/*
- * Fill in the key and data for this big pair.
- */
-int32_t
-__big_keydata(hashp, pagep, key, val, ndx)
- HTAB *hashp;
- PAGE16 *pagep;
- DBT *key, *val;
- int32_t ndx;
-{
- ITEM_INFO ii;
- PAGE16 *key_pagep;
- db_pgno_t last_page;
-
- key_pagep =
- __get_page(hashp, OADDR_TO_PAGE(DATA_OFF(pagep, ndx)), A_RAW);
- if (!key_pagep)
- return (-1);
- key->size = collect_key(hashp, key_pagep, 0, &last_page);
- key->data = hashp->bigkey_buf;
- __put_page(hashp, key_pagep, A_RAW, 0);
-
- if (key->size == -1)
- return (-1);
-
- /* Create an item_info to direct __big_return to the beginning pgno. */
- ii.pgno = last_page;
- return (__big_return(hashp, &ii, val, 1));
-}
-
-/*
- * Return the big key on page, ndx.
- */
-int32_t
-#ifdef __STDC__
-__get_bigkey(HTAB *hashp, PAGE16 *pagep, indx_t ndx, DBT *key)
-#else
-__get_bigkey(hashp, pagep, ndx, key)
- HTAB *hashp;
- PAGE16 *pagep;
- u_int32_t ndx;
- DBT *key;
-#endif
-{
- PAGE16 *key_pagep;
-
- key_pagep =
- __get_page(hashp, OADDR_TO_PAGE(DATA_OFF(pagep, ndx)), A_RAW);
- if (!pagep)
- return (-1);
- key->size = collect_key(hashp, key_pagep, 0, NULL);
- key->data = hashp->bigkey_buf;
-
- __put_page(hashp, key_pagep, A_RAW, 0);
-
- return (0);
-}
-
-/*
- * Return the big key and data indicated in item_info.
- */
-int32_t
-__big_return(hashp, item_info, val, on_bigkey_page)
- HTAB *hashp;
- ITEM_INFO *item_info;
- DBT *val;
- int32_t on_bigkey_page;
-{
- PAGE16 *pagep;
- db_pgno_t next_pgno;
-
- if (!on_bigkey_page) {
- /* Get first page with big pair on it. */
- pagep = __get_page(hashp,
- OADDR_TO_PAGE(item_info->data_off), A_RAW);
- if (!pagep)
- return (-1);
- } else {
- pagep = __get_page(hashp, item_info->pgno, A_RAW);
- if (!pagep)
- return (-1);
- }
-
- /* Traverse through the bigkey pages until a page with data is found. */
- while (!BIGDATALEN(pagep)) {
- next_pgno = NEXT_PGNO(pagep);
- __put_page(hashp, pagep, A_RAW, 0);
- pagep = __get_page(hashp, next_pgno, A_RAW);
- if (!pagep)
- return (-1);
- }
-
- val->size = collect_data(hashp, pagep, 0);
- if (val->size < 1)
- return (-1);
- val->data = (void *)hashp->bigdata_buf;
-
- __put_page(hashp, pagep, A_RAW, 0);
- return (0);
-}
-
-/*
- * Given a page with a big key on it, traverse through the pages counting data
- * length, and collect all of the data on the way up. Store the key in
- * hashp->bigkey_buf. last_page indicates to the calling function what the
- * last page with key on it is; this will help if you later want to retrieve
- * the data portion.
- *
- * Does the work for __get_bigkey.
- *
- * Return total length of data; -1 if error.
- */
-static int32_t
-collect_key(hashp, pagep, len, last_page)
- HTAB *hashp;
- PAGE16 *pagep;
- int32_t len;
- db_pgno_t *last_page;
-{
- PAGE16 *next_pagep;
- int32_t totlen, retval;
- db_pgno_t next_pgno;
-#ifdef DEBUG
- db_pgno_t save_addr;
-#endif
-
- /* If this is the last page with key. */
- if (BIGDATALEN(pagep)) {
- totlen = len + BIGKEYLEN(pagep);
- if (hashp->bigkey_buf)
- free(hashp->bigkey_buf);
- hashp->bigkey_buf = (u_int8_t *)malloc(totlen);
- if (!hashp->bigkey_buf)
- return (-1);
- memcpy(hashp->bigkey_buf + len,
- BIGKEY(pagep), BIGKEYLEN(pagep));
- if (last_page)
- *last_page = ADDR(pagep);
- return (totlen);
- }
-
- /* Key filled up all of last key page, so we've gone 1 too far. */
- if (BIGKEYLEN(pagep) == 0) {
- if (hashp->bigkey_buf)
- free(hashp->bigkey_buf);
- hashp->bigkey_buf = (u_int8_t *)malloc(len);
- return (hashp->bigkey_buf ? len : -1);
- }
- totlen = len + BIGKEYLEN(pagep);
-
- /* Set pagep to the next page in the chain. */
- if (last_page)
- *last_page = ADDR(pagep);
- next_pgno = NEXT_PGNO(pagep);
- next_pagep = __get_page(hashp, next_pgno, A_RAW);
- if (!next_pagep)
- return (-1);
-#ifdef DEBUG
- save_addr = ADDR(pagep);
-#endif
- retval = collect_key(hashp, next_pagep, totlen, last_page);
-
-#ifdef DEBUG
- assert(save_addr == ADDR(pagep));
-#endif
- memcpy(hashp->bigkey_buf + len, BIGKEY(pagep), BIGKEYLEN(pagep));
- __put_page(hashp, next_pagep, A_RAW, 0);
-
- return (retval);
-}
-
-/*
- * Given a page with big data on it, recur through the pages counting data
- * length, and collect all of the data on the way up. Store the data in
- * hashp->bigdata_buf.
- *
- * Does the work for __big_return.
- *
- * Return total length of data; -1 if error.
- */
-static int32_t
-collect_data(hashp, pagep, len)
- HTAB *hashp;
- PAGE16 *pagep;
- int32_t len;
-{
- PAGE16 *next_pagep;
- int32_t totlen, retval;
- db_pgno_t next_pgno;
-#ifdef DEBUG
- db_pgno_t save_addr;
-#endif
-
- /* If there is no next page. */
- if (NEXT_PGNO(pagep) == INVALID_PGNO) {
- if (hashp->bigdata_buf)
- free(hashp->bigdata_buf);
- totlen = len + BIGDATALEN(pagep);
- hashp->bigdata_buf = (u_int8_t *)malloc(totlen);
- if (!hashp->bigdata_buf)
- return (-1);
- memcpy(hashp->bigdata_buf + totlen - BIGDATALEN(pagep),
- BIGDATA(pagep), BIGDATALEN(pagep));
- return (totlen);
- }
- totlen = len + BIGDATALEN(pagep);
-
- /* Set pagep to the next page in the chain. */
- next_pgno = NEXT_PGNO(pagep);
- next_pagep = __get_page(hashp, next_pgno, A_RAW);
- if (!next_pagep)
- return (-1);
-
-#ifdef DEBUG
- save_addr = ADDR(pagep);
-#endif
- retval = collect_data(hashp, next_pagep, totlen);
-#ifdef DEBUG
- assert(save_addr == ADDR(pagep));
-#endif
- memcpy(hashp->bigdata_buf + totlen - BIGDATALEN(pagep),
- BIGDATA(pagep), BIGDATALEN(pagep));
- __put_page(hashp, next_pagep, A_RAW, 0);
-
- return (retval);
-}
diff --git a/src/util/db2/hash/hash_debug.c b/src/util/db2/hash/hash_debug.c
deleted file mode 100644
index 69229fc8df..0000000000
--- a/src/util/db2/hash/hash_debug.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*-
- * Copyright (c) 1995
- * The President and Fellows of Harvard University
- *
- * This code is derived from software contributed to Harvard by
- * Jeremy Rassen.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)hash_debug.c 8.4 (Berkeley) 11/7/95";
-#endif /* LIBC_SCCS and not lint */
-
-#ifdef DEBUG
-/*
- * PACKAGE: hashing
- *
- * DESCRIPTION:
- * Debug routines.
- *
- * ROUTINES:
- *
- * External
- * __dump_bucket
- */
-#include <stdio.h>
-
-#include "db-int.h"
-#include "hash.h"
-#include "page.h"
-#include "extern.h"
-
-void
-__dump_bucket(hashp, bucket)
- HTAB *hashp;
- u_int32_t bucket;
-{
- CURSOR cursor;
- DBT key, val;
- ITEM_INFO item_info;
- int var;
- char *cp;
-
- cursor.pagep = NULL;
- item_info.seek_size = 0;
- item_info.seek_found_page = 0;
-
- __get_item_reset(hashp, &cursor);
-
- cursor.bucket = bucket;
- for (;;) {
- __get_item_next(hashp, &cursor, &key, &val, &item_info);
- if (item_info.status == ITEM_ERROR) {
- (void)printf("get_item_next returned error\n");
- break;
- } else if (item_info.status == ITEM_NO_MORE)
- break;
-
- if (item_info.key_off == BIGPAIR) {
- if (__big_keydata(hashp, cursor.pagep, &key, &val,
- item_info.pgndx)) {
- (void)printf("__big_keydata returned error\n");
- break;
- }
- }
-
- if (key.size == sizeof(int)) {
- memcpy(&var, key.data, sizeof(int));
- (void)printf("%d\n", var);
- } else {
- for (cp = (char *)key.data; key.size--; cp++)
- (void)printf("%c", *cp);
- (void)printf("\n");
- }
- }
- __get_item_done(hashp, &cursor);
-}
-#endif /* DEBUG */
diff --git a/src/util/db2/hash/hash_func.c b/src/util/db2/hash/hash_func.c
deleted file mode 100644
index 1dee694608..0000000000
--- a/src/util/db2/hash/hash_func.c
+++ /dev/null
@@ -1,201 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Margo Seltzer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)hash_func.c 8.4 (Berkeley) 11/7/95";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-
-#include "db-int.h"
-#include "hash.h"
-#include "page.h"
-#include "extern.h"
-
-#if 0
-static u_int32_t hash1 __P((const void *, size_t));
-static u_int32_t hash2 __P((const void *, size_t));
-static u_int32_t hash3 __P((const void *, size_t));
-#endif
-static u_int32_t hash4 __P((const void *, size_t));
-
-/* Default hash function. */
-u_int32_t (*__default_hash) __P((const void *, size_t)) = hash4;
-
-/*
- * Assume that we've already split the bucket to which this key hashes,
- * calculate that bucket, and check that in fact we did already split it.
- *
- * EJB's original hsearch hash.
- */
-#define PRIME1 37
-#define PRIME2 1048583
-
-#if 0
-static u_int32_t
-hash1(key, len)
- const void *key;
- size_t len;
-{
- u_int32_t h;
- u_int8_t *k;
-
- h = 0;
- k = (u_int8_t *)key;
- /* Convert string to integer */
- while (len--)
- h = h * PRIME1 ^ (*k++ - ' ');
- h %= PRIME2;
- return (h);
-}
-
-/*
- * Phong Vo's linear congruential hash
- */
-#define dcharhash(h, c) ((h) = 0x63c63cd9*(h) + 0x9c39c33d + (c))
-
-static u_int32_t
-hash2(key, len)
- const void *key;
- size_t len;
-{
- u_int32_t h;
- u_int8_t *e, c, *k;
-
- k = (u_int8_t *)key;
- e = k + len;
- for (h = 0; k != e;) {
- c = *k++;
- if (!c && k > e)
- break;
- dcharhash(h, c);
- }
- return (h);
-}
-
-/*
- * This is INCREDIBLY ugly, but fast. We break the string up into 8 byte
- * units. On the first time through the loop we get the "leftover bytes"
- * (strlen % 8). On every other iteration, we perform 8 HASHC's so we handle
- * all 8 bytes. Essentially, this saves us 7 cmp & branch instructions. If
- * this routine is heavily used enough, it's worth the ugly coding.
- *
- * Ozan Yigit's original sdbm hash.
- */
-static u_int32_t
-hash3(key, len)
- const void *key;
- size_t len;
-{
- u_int32_t n, loop;
- u_int8_t *k;
-
-#define HASHC n = *k++ + 65599 * n
-
- n = 0;
- k = (u_int8_t *)key;
- if (len > 0) {
- loop = (len + 8 - 1) >> 3;
-
- switch (len & (8 - 1)) {
- case 0:
- do { /* All fall throughs */
- HASHC;
- case 7:
- HASHC;
- case 6:
- HASHC;
- case 5:
- HASHC;
- case 4:
- HASHC;
- case 3:
- HASHC;
- case 2:
- HASHC;
- case 1:
- HASHC;
- } while (--loop);
- }
-
- }
- return (n);
-}
-#endif
-
-
-/* Chris Torek's hash function. */
-static u_int32_t
-hash4(key, len)
- const void *key;
- size_t len;
-{
- u_int32_t h, loop;
- const u_int8_t *k;
-
-#define HASH4a h = (h << 5) - h + *k++;
-#define HASH4b h = (h << 5) + h + *k++;
-#define HASH4 HASH4b
-
- h = 0;
- k = (const u_int8_t *)key;
- if (len > 0) {
- loop = (len + 8 - 1) >> 3;
-
- switch (len & (8 - 1)) {
- case 0:
- do { /* All fall throughs */
- HASH4;
- case 7:
- HASH4;
- case 6:
- HASH4;
- case 5:
- HASH4;
- case 4:
- HASH4;
- case 3:
- HASH4;
- case 2:
- HASH4;
- case 1:
- HASH4;
- } while (--loop);
- }
-
- }
- return (h);
-}
diff --git a/src/util/db2/hash/hash_log2.c b/src/util/db2/hash/hash_log2.c
deleted file mode 100644
index 8c710e5d21..0000000000
--- a/src/util/db2/hash/hash_log2.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Margo Seltzer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)hash_log2.c 8.4 (Berkeley) 11/7/95";
-#endif /* LIBC_SCCS and not lint */
-
-#include "db-int.h"
-#include "hash.h"
-#include "page.h"
-#include "extern.h"
-
-u_int32_t
-__kdb2_log2(num)
- u_int32_t num;
-{
- u_int32_t i, limit;
-
- limit = 1;
- for (i = 0; limit < num; limit = limit << 1, i++);
- return (i);
-}
diff --git a/src/util/db2/hash/hash_page.c b/src/util/db2/hash/hash_page.c
deleted file mode 100644
index e25115d3f0..0000000000
--- a/src/util/db2/hash/hash_page.c
+++ /dev/null
@@ -1,1387 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Margo Seltzer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)hash_page.c 8.11 (Berkeley) 11/7/95";
-#endif /* LIBC_SCCS and not lint */
-
-/*
- * PACKAGE: hashing
- *
- * DESCRIPTION:
- * Page manipulation for hashing package.
- *
- * ROUTINES:
- *
- * External
- * __get_page
- * __add_ovflpage
- * Internal
- * overflow_page
- * open_temp
- */
-
-#include <sys/types.h>
-
-#ifdef DEBUG
-#include <assert.h>
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "db-int.h"
-#include "hash.h"
-#include "page.h"
-#include "extern.h"
-
-static int32_t add_bigptr __P((HTAB *, ITEM_INFO *, indx_t));
-static u_int32_t *fetch_bitmap __P((HTAB *, int32_t));
-static u_int32_t first_free __P((u_int32_t));
-static indx_t next_realkey __P((PAGE16 *, indx_t));
-static u_int16_t overflow_page __P((HTAB *));
-static void page_init __P((HTAB *, PAGE16 *, db_pgno_t, u_int8_t));
-static indx_t prev_realkey __P((PAGE16 *, indx_t));
-static void putpair __P((PAGE8 *, const DBT *, const DBT *));
-static void swap_page_header_in __P((PAGE16 *));
-static void swap_page_header_out __P((PAGE16 *));
-
-#ifdef DEBUG_SLOW
-static void account_page(HTAB *, db_pgno_t, int);
-#endif
-
-u_int32_t
-__get_item(hashp, cursorp, key, val, item_info)
- HTAB *hashp;
- CURSOR *cursorp;
- DBT *key, *val;
- ITEM_INFO *item_info;
-{
- db_pgno_t next_pgno;
- int32_t i;
-
- /* Check if we need to get a page. */
- if (!cursorp->pagep) {
- if (cursorp->pgno == INVALID_PGNO) {
- cursorp->pagep =
- __get_page(hashp, cursorp->bucket, A_BUCKET);
- cursorp->pgno = ADDR(cursorp->pagep);
- cursorp->ndx = 0;
- cursorp->pgndx = 0;
- } else
- cursorp->pagep =
- __get_page(hashp, cursorp->pgno, A_RAW);
- if (!cursorp->pagep) {
- item_info->status = ITEM_ERROR;
- return (-1);
- }
- }
- if (item_info->seek_size &&
- FREESPACE(cursorp->pagep) > item_info->seek_size)
- item_info->seek_found_page = cursorp->pgno;
-
- if (cursorp->pgndx == NUM_ENT(cursorp->pagep)) {
- /* Fetch next page. */
- if (NEXT_PGNO(cursorp->pagep) == INVALID_PGNO) {
- item_info->status = ITEM_NO_MORE;
- return (-1);
- }
- next_pgno = NEXT_PGNO(cursorp->pagep);
- cursorp->pgndx = 0;
- __put_page(hashp, cursorp->pagep, A_RAW, 0);
- cursorp->pagep = __get_page(hashp, next_pgno, A_RAW);
- if (!cursorp->pagep) {
- item_info->status = ITEM_ERROR;
- return (-1);
- }
- cursorp->pgno = next_pgno;
- }
- if (KEY_OFF(cursorp->pagep, cursorp->pgndx) != BIGPAIR) {
- if ((i = prev_realkey(cursorp->pagep, cursorp->pgndx)) ==
- cursorp->pgndx)
- key->size = hashp->hdr.bsize -
- KEY_OFF(cursorp->pagep, cursorp->pgndx);
- else
- key->size = DATA_OFF(cursorp->pagep, i) -
- KEY_OFF(cursorp->pagep, cursorp->pgndx);
- }
-
- /*
- * All of this information will be set incorrectly for big keys, but
- * it will be ignored anyway.
- */
- val->size = KEY_OFF(cursorp->pagep, cursorp->pgndx) -
- DATA_OFF(cursorp->pagep, cursorp->pgndx);
- key->data = KEY(cursorp->pagep, cursorp->pgndx);
- val->data = DATA(cursorp->pagep, cursorp->pgndx);
- item_info->pgno = cursorp->pgno;
- item_info->bucket = cursorp->bucket;
- item_info->ndx = cursorp->ndx;
- item_info->pgndx = cursorp->pgndx;
- item_info->key_off = KEY_OFF(cursorp->pagep, cursorp->pgndx);
- item_info->data_off = DATA_OFF(cursorp->pagep, cursorp->pgndx);
- item_info->status = ITEM_OK;
-
- return (0);
-}
-
-u_int32_t
-__get_item_reset(hashp, cursorp)
- HTAB *hashp;
- CURSOR *cursorp;
-{
- if (cursorp->pagep)
- __put_page(hashp, cursorp->pagep, A_RAW, 0);
- cursorp->pagep = NULL;
- cursorp->bucket = -1;
- cursorp->ndx = 0;
- cursorp->pgndx = 0;
- cursorp->pgno = INVALID_PGNO;
- return (0);
-}
-
-u_int32_t
-__get_item_done(hashp, cursorp)
- HTAB *hashp;
- CURSOR *cursorp;
-{
- if (cursorp->pagep)
- __put_page(hashp, cursorp->pagep, A_RAW, 0);
- cursorp->pagep = NULL;
-
- /*
- * We don't throw out the page number since we might want to
- * continue getting on this page.
- */
- return (0);
-}
-
-u_int32_t
-__get_item_first(hashp, cursorp, key, val, item_info)
- HTAB *hashp;
- CURSOR *cursorp;
- DBT *key, *val;
- ITEM_INFO *item_info;
-{
- __get_item_reset(hashp, cursorp);
- cursorp->bucket = 0;
- return (__get_item_next(hashp, cursorp, key, val, item_info));
-}
-
-/*
- * Returns a pointer to key/data pair on a page. In the case of bigkeys,
- * just returns the page number and index of the bigkey pointer pair.
- */
-u_int32_t
-__get_item_next(hashp, cursorp, key, val, item_info)
- HTAB *hashp;
- CURSOR *cursorp;
- DBT *key, *val;
- ITEM_INFO *item_info;
-{
- int status;
-
- status = __get_item(hashp, cursorp, key, val, item_info);
- cursorp->ndx++;
- cursorp->pgndx++;
- return (status);
-}
-
-/*
- * Put a non-big pair on a page.
- */
-static void
-putpair(p, key, val)
- PAGE8 *p;
- const DBT *key, *val;
-{
- u_int16_t *pagep, n, off;
-
- pagep = (PAGE16 *)p;
-
- /* Items on the page are 0-indexed. */
- n = NUM_ENT(pagep);
- off = OFFSET(pagep) - key->size + 1;
- memmove(p + off, key->data, key->size);
- KEY_OFF(pagep, n) = off;
-
- off -= val->size;
- memmove(p + off, val->data, val->size);
- DATA_OFF(pagep, n) = off;
-
- /* Adjust page info. */
- NUM_ENT(pagep) = n + 1;
- OFFSET(pagep) = off - 1;
-}
-
-/*
- * Returns the index of the next non-bigkey pair after n on the page.
- * Returns -1 if there are no more non-big things on the page.
- */
-static indx_t
-#ifdef __STDC__
-next_realkey(PAGE16 * pagep, indx_t n)
-#else
-next_realkey(pagep, n)
- PAGE16 *pagep;
- u_int32_t n;
-#endif
-{
- indx_t i;
-
- for (i = n + 1; i < NUM_ENT(pagep); i++)
- if (KEY_OFF(pagep, i) != BIGPAIR)
- return (i);
- return (-1);
-}
-
-/*
- * Returns the index of the previous non-bigkey pair after n on the page.
- * Returns n if there are no previous non-big things on the page.
- */
-static indx_t
-#ifdef __STDC__
-prev_realkey(PAGE16 * pagep, indx_t n)
-#else
-prev_realkey(pagep, n)
- PAGE16 *pagep;
- u_int32_t n;
-#endif
-{
- int32_t i;
-
- /* Need a signed value to do the compare properly. */
- for (i = n - 1; i > -1; i--)
- if (KEY_OFF(pagep, i) != BIGPAIR)
- return (i);
- return (n);
-}
-
-/*
- * Returns:
- * 0 OK
- * -1 error
- */
-extern int32_t
-__delpair(hashp, cursorp, item_info)
- HTAB *hashp;
- CURSOR *cursorp;
- ITEM_INFO *item_info;
-{
- PAGE16 *pagep;
- indx_t ndx;
- short check_ndx;
- int16_t delta, len, next_key;
- int32_t n;
- u_int8_t *src, *dest;
-
- ndx = cursorp->pgndx;
- if (!cursorp->pagep) {
- pagep = __get_page(hashp, cursorp->pgno, A_RAW);
- if (!pagep)
- return (-1);
- /*
- * KLUGE: pgndx has gone one too far, because cursor points
- * to the _next_ item. Use pgndx - 1.
- */
- --ndx;
- } else
- pagep = cursorp->pagep;
-#ifdef DEBUG
- assert(ADDR(pagep) == cursorp->pgno);
-#endif
-
- if (KEY_OFF(pagep, ndx) == BIGPAIR) {
- delta = 0;
- __big_delete(hashp, pagep, ndx);
- } else {
- /*
- * Compute "delta", the amount we have to shift all of the
- * offsets. To find the delta, we need to make sure that
- * we aren't looking at the DATA_OFF of a big/keydata pair.
- */
- for (check_ndx = (short)(ndx - 1);
- check_ndx >= 0 && KEY_OFF(pagep, check_ndx) == BIGPAIR;
- check_ndx--);
- if (check_ndx < 0)
- delta = hashp->hdr.bsize - DATA_OFF(pagep, ndx);
- else
- delta =
- DATA_OFF(pagep, check_ndx) - DATA_OFF(pagep, ndx);
-
- /*
- * The hard case: we want to remove something other than
- * the last item on the page. We need to shift data and
- * offsets down.
- */
- if (ndx != NUM_ENT(pagep) - 1) {
- /*
- * Move the data: src is the address of the last data
- * item on the page.
- */
- src = (u_int8_t *)pagep + OFFSET(pagep) + 1;
- /*
- * Length is the distance between where to start
- * deleting and end of the data on the page.
- */
- len = DATA_OFF(pagep, ndx) - (OFFSET(pagep) + 1);
- /*
- * Dest is the location of the to-be-deleted item
- * occupied - length.
- */
- if (check_ndx < 0)
- dest =
- (u_int8_t *)pagep + hashp->hdr.bsize - len;
- else
- dest = (u_int8_t *)pagep +
- DATA_OFF(pagep, (check_ndx)) - len;
- memmove(dest, src, len);
- }
- }
-
- /* Adjust the offsets. */
- for (n = ndx; n < NUM_ENT(pagep) - 1; n++)
- if (KEY_OFF(pagep, (n + 1)) != BIGPAIR) {
- next_key = next_realkey(pagep, n);
-#ifdef DEBUG
- assert(next_key != -1);
-#endif
- KEY_OFF(pagep, n) = KEY_OFF(pagep, (n + 1)) + delta;
- DATA_OFF(pagep, n) = DATA_OFF(pagep, (n + 1)) + delta;
- } else {
- KEY_OFF(pagep, n) = KEY_OFF(pagep, (n + 1));
- DATA_OFF(pagep, n) = DATA_OFF(pagep, (n + 1));
- }
-
- /* Adjust page metadata. */
- OFFSET(pagep) = OFFSET(pagep) + delta;
- NUM_ENT(pagep) = NUM_ENT(pagep) - 1;
-
- --hashp->hdr.nkeys;
-
- /* Is this page now an empty overflow page? If so, free it. */
- if (TYPE(pagep) == HASH_OVFLPAGE && NUM_ENT(pagep) == 0) {
- PAGE16 *empty_page;
- db_pgno_t to_find, next_pgno, link_page;
-
- /*
- * We need to go back to the first page in the chain and
- * look for this page so that we can update the previous
- * page's NEXT_PGNO field.
- */
- to_find = ADDR(pagep);
- empty_page = pagep;
- link_page = NEXT_PGNO(empty_page);
- pagep = __get_page(hashp, item_info->bucket, A_BUCKET);
- if (!pagep)
- return (-1);
- while (NEXT_PGNO(pagep) != to_find) {
- next_pgno = NEXT_PGNO(pagep);
-#ifdef DEBUG
- assert(next_pgno != INVALID_PGNO);
-#endif
- __put_page(hashp, pagep, A_RAW, 0);
- pagep = __get_page(hashp, next_pgno, A_RAW);
- if (!pagep)
- return (-1);
- }
-
- /*
- * At this point, pagep should point to the page before the
- * page to be deleted.
- */
- NEXT_PGNO(pagep) = link_page;
- if (item_info->pgno == to_find) {
- item_info->pgno = ADDR(pagep);
- item_info->pgndx = NUM_ENT(pagep);
- item_info->seek_found_page = ADDR(pagep);
- }
- __delete_page(hashp, empty_page, A_OVFL);
- }
- __put_page(hashp, pagep, A_RAW, 1);
-
- return (0);
-}
-
-extern int32_t
-__split_page(hashp, obucket, nbucket)
- HTAB *hashp;
- u_int32_t obucket, nbucket;
-{
- DBT key, val;
- ITEM_INFO old_ii, new_ii;
- PAGE16 *old_pagep, *temp_pagep;
- db_pgno_t next_pgno;
- int32_t off;
- u_int16_t n;
- int8_t base_page;
-
- off = hashp->hdr.bsize;
- old_pagep = __get_page(hashp, obucket, A_BUCKET);
-
- base_page = 1;
-
- temp_pagep = hashp->split_buf;
- memcpy(temp_pagep, old_pagep, hashp->hdr.bsize);
-
- page_init(hashp, old_pagep, ADDR(old_pagep), HASH_PAGE);
- __put_page(hashp, old_pagep, A_RAW, 1);
-
- old_ii.pgno = BUCKET_TO_PAGE(obucket);
- new_ii.pgno = BUCKET_TO_PAGE(nbucket);
- old_ii.bucket = obucket;
- new_ii.bucket = nbucket;
- old_ii.seek_found_page = new_ii.seek_found_page = 0;
-
- while (temp_pagep != 0) {
- off = hashp->hdr.bsize;
- for (n = 0; n < NUM_ENT(temp_pagep); n++) {
- if (KEY_OFF(temp_pagep, n) == BIGPAIR) {
- __get_bigkey(hashp, temp_pagep, n, &key);
- if (__call_hash(hashp,
- key.data, key.size) == obucket)
- add_bigptr(hashp, &old_ii,
- DATA_OFF(temp_pagep, n));
- else
- add_bigptr(hashp, &new_ii,
- DATA_OFF(temp_pagep, n));
- } else {
- key.size = off - KEY_OFF(temp_pagep, n);
- key.data = KEY(temp_pagep, n);
- off = KEY_OFF(temp_pagep, n);
- val.size = off - DATA_OFF(temp_pagep, n);
- val.data = DATA(temp_pagep, n);
- if (__call_hash(hashp,
- key.data, key.size) == obucket)
- __addel(hashp, &old_ii, &key, &val,
- NO_EXPAND, 1);
- else
- __addel(hashp, &new_ii, &key, &val,
- NO_EXPAND, 1);
- off = DATA_OFF(temp_pagep, n);
- }
- }
- next_pgno = NEXT_PGNO(temp_pagep);
-
- /* Clear temp_page; if it's an overflow page, free it. */
- if (!base_page)
- __delete_page(hashp, temp_pagep, A_OVFL);
- else
- base_page = 0;
- if (next_pgno != INVALID_PGNO)
- temp_pagep = __get_page(hashp, next_pgno, A_RAW);
- else
- break;
- }
- return (0);
-}
-
-/*
- * Add the given pair to the page.
- *
- *
- * Returns:
- * 0 ==> OK
- * -1 ==> failure
- */
-extern int32_t
-#ifdef __STDC__
-__addel(HTAB *hashp, ITEM_INFO *item_info, const DBT *key, const DBT *val,
- u_int32_t num_items, const u_int8_t expanding)
-#else
-__addel(hashp, item_info, key, val, num_items, expanding)
- HTAB *hashp;
- ITEM_INFO *item_info;
- const DBT *key, *val;
- u_int32_t num_items;
- const u_int32_t expanding;
-#endif
-{
- PAGE16 *pagep;
- int32_t do_expand;
- db_pgno_t next_pgno;
-
- do_expand = 0;
-
- pagep = __get_page(hashp,
- item_info->seek_found_page != 0 ?
- item_info->seek_found_page : item_info->pgno, A_RAW);
- if (!pagep)
- return (-1);
-
- /* Advance to first page in chain with room for item. */
- while (NUM_ENT(pagep) && NEXT_PGNO(pagep) != INVALID_PGNO) {
- /*
- * This may not be the end of the chain, but the pair may fit
- * anyway.
- */
- if (ISBIG(PAIRSIZE(key, val), hashp) && BIGPAIRFITS(pagep))
- break;
- if (PAIRFITS(pagep, key, val))
- break;
- next_pgno = NEXT_PGNO(pagep);
- __put_page(hashp, pagep, A_RAW, 0);
- pagep = (PAGE16 *)__get_page(hashp, next_pgno, A_RAW);
- if (!pagep)
- return (-1);
- }
-
- if ((ISBIG(PAIRSIZE(key, val), hashp) &&
- !BIGPAIRFITS(pagep)) ||
- (!ISBIG(PAIRSIZE(key, val), hashp) &&
- !PAIRFITS(pagep, key, val))) {
- do_expand = 1;
- pagep = __add_ovflpage(hashp, pagep);
- if (!pagep)
- return (-1);
-
- if ((ISBIG(PAIRSIZE(key, val), hashp) &&
- !BIGPAIRFITS(pagep)) ||
- (!ISBIG(PAIRSIZE(key, val), hashp) &&
- !PAIRFITS(pagep, key, val))) {
- __put_page(hashp, pagep, A_RAW, 0);
- return (-1);
- }
- }
-
- /* At this point, we know the page fits, so we just add it */
-
- if (ISBIG(PAIRSIZE(key, val), hashp)) {
- if (__big_insert(hashp, pagep, key, val))
- return (-1);
- } else {
- putpair((PAGE8 *)pagep, key, val);
- }
-
- /*
- * For splits, we are going to update item_info's page number
- * field, so that we can easily return to the same page the
- * next time we come in here. For other operations, this shouldn't
- * matter, since adds are the last thing that happens before we
- * return to the user program.
- */
- item_info->pgno = ADDR(pagep);
-
- if (!expanding)
- hashp->hdr.nkeys++;
-
- /* Kludge: if this is a big page, then it's already been put. */
- if (!ISBIG(PAIRSIZE(key, val), hashp))
- __put_page(hashp, pagep, A_RAW, 1);
-
- if (expanding)
- item_info->caused_expand = 0;
- else
- switch (num_items) {
- case NO_EXPAND:
- item_info->caused_expand = 0;
- break;
- case UNKNOWN:
- item_info->caused_expand |=
- (hashp->hdr.nkeys / hashp->hdr.max_bucket) >
- hashp->hdr.ffactor ||
- item_info->pgndx > hashp->hdr.ffactor;
- break;
- default:
- item_info->caused_expand =
- num_items > hashp->hdr.ffactor ? 1 : do_expand;
- break;
- }
- return (0);
-}
-
-/*
- * Special __addel used in big splitting; this one just puts the pointer
- * to an already-allocated big page in the appropriate bucket.
- */
-static int32_t
-#ifdef __STDC__
-add_bigptr(HTAB * hashp, ITEM_INFO * item_info, indx_t big_pgno)
-#else
-add_bigptr(hashp, item_info, big_pgno)
- HTAB *hashp;
- ITEM_INFO *item_info;
- u_int32_t big_pgno;
-#endif
-{
- PAGE16 *pagep;
- db_pgno_t next_pgno;
-
- pagep = __get_page(hashp, item_info->bucket, A_BUCKET);
- if (!pagep)
- return (-1);
-
- /*
- * Note: in __addel(), we used item_info->pgno for the beginning of
- * our search for space. Now, we use item_info->bucket, since we
- * know that the space required by a big pair on the base page is
- * quite small, and we may very well find that space early in the
- * chain.
- */
-
- /* Find first page in chain that has space for a big pair. */
- while (NUM_ENT(pagep) && (NEXT_PGNO(pagep) != INVALID_PGNO)) {
- if (BIGPAIRFITS(pagep))
- break;
- next_pgno = NEXT_PGNO(pagep);
- __put_page(hashp, pagep, A_RAW, 0);
- pagep = __get_page(hashp, next_pgno, A_RAW);
- if (!pagep)
- return (-1);
- }
- if (!BIGPAIRFITS(pagep)) {
- pagep = __add_ovflpage(hashp, pagep);
- if (!pagep)
- return (-1);
-#ifdef DEBUG
- assert(BIGPAIRFITS(pagep));
-#endif
- }
- KEY_OFF(pagep, NUM_ENT(pagep)) = BIGPAIR;
- DATA_OFF(pagep, NUM_ENT(pagep)) = big_pgno;
- NUM_ENT(pagep) = NUM_ENT(pagep) + 1;
-
- __put_page(hashp, pagep, A_RAW, 1);
-
- return (0);
-}
-
-/*
- *
- * Returns:
- * pointer on success
- * NULL on error
- */
-extern PAGE16 *
-__add_ovflpage(hashp, pagep)
- HTAB *hashp;
- PAGE16 *pagep;
-{
- PAGE16 *new_pagep;
- u_int16_t ovfl_num;
-
- /* Check if we are dynamically determining the fill factor. */
- if (hashp->hdr.ffactor == DEF_FFACTOR) {
- hashp->hdr.ffactor = NUM_ENT(pagep) >> 1;
- if (hashp->hdr.ffactor < MIN_FFACTOR)
- hashp->hdr.ffactor = MIN_FFACTOR;
- }
- ovfl_num = overflow_page(hashp);
- if (!ovfl_num)
- return (NULL);
-
- if (__new_page(hashp, (u_int32_t)ovfl_num, A_OVFL) != 0)
- return (NULL);
-
- if (!ovfl_num || !(new_pagep = __get_page(hashp, ovfl_num, A_OVFL)))
- return (NULL);
-
- NEXT_PGNO(pagep) = (db_pgno_t)OADDR_TO_PAGE(ovfl_num);
- TYPE(new_pagep) = HASH_OVFLPAGE;
-
- __put_page(hashp, pagep, A_RAW, 1);
-
-#ifdef HASH_STATISTICS
- hash_overflows++;
-#endif
- return (new_pagep);
-}
-
-/*
- *
- * Returns:
- * pointer on success
- * NULL on error
- */
-extern PAGE16 *
-#ifdef __STDC__
-__add_bigpage(HTAB * hashp, PAGE16 * pagep, indx_t ndx, const u_int8_t
- is_basepage)
-#else
-__add_bigpage(hashp, pagep, ndx, is_basepage)
- HTAB *hashp;
- PAGE16 *pagep;
- u_int32_t ndx;
- const u_int32_t is_basepage;
-#endif
-{
- PAGE16 *new_pagep;
- u_int16_t ovfl_num;
-
- ovfl_num = overflow_page(hashp);
- if (!ovfl_num)
- return (NULL);
-
- if (__new_page(hashp, (u_int32_t)ovfl_num, A_OVFL) != 0)
- return (NULL);
-
- if (!ovfl_num || !(new_pagep = __get_page(hashp, ovfl_num, A_OVFL)))
- return (NULL);
-
- if (is_basepage) {
- KEY_OFF(pagep, ndx) = BIGPAIR;
- DATA_OFF(pagep, ndx) = (indx_t)ovfl_num;
- } else
- NEXT_PGNO(pagep) = ADDR(new_pagep);
-
- __put_page(hashp, pagep, A_RAW, 1);
-
- TYPE(new_pagep) = HASH_BIGPAGE;
-
-#ifdef HASH_STATISTICS
- hash_bigpages++;
-#endif
- return (new_pagep);
-}
-
-static void
-#ifdef __STDC__
-page_init(HTAB * hashp, PAGE16 * pagep, db_pgno_t pgno, u_int8_t type)
-#else
-page_init(hashp, pagep, pgno, type)
- HTAB *hashp;
- PAGE16 *pagep;
- db_pgno_t pgno;
- u_int32_t type;
-#endif
-{
- NUM_ENT(pagep) = 0;
- PREV_PGNO(pagep) = NEXT_PGNO(pagep) = INVALID_PGNO;
- TYPE(pagep) = type;
- OFFSET(pagep) = hashp->hdr.bsize - 1;
- /*
- * Note: since in the current version ADDR(pagep) == PREV_PGNO(pagep),
- * make sure that ADDR(pagep) is set after resetting PREV_PGNO(pagep).
- * We reset PREV_PGNO(pagep) just in case the macros are changed.
- */
- ADDR(pagep) = pgno;
-
- return;
-}
-
-int32_t
-__new_page(hashp, addr, addr_type)
- HTAB *hashp;
- u_int32_t addr;
- int32_t addr_type;
-{
- db_pgno_t paddr;
- PAGE16 *pagep;
-
- switch (addr_type) { /* Convert page number. */
- case A_BUCKET:
- paddr = BUCKET_TO_PAGE(addr);
- break;
- case A_OVFL:
- case A_BITMAP:
- paddr = OADDR_TO_PAGE(addr);
- break;
- default:
- paddr = addr;
- break;
- }
- pagep = mpool_new(hashp->mp, &paddr, MPOOL_PAGE_REQUEST);
- if (!pagep)
- return (-1);
-#if DEBUG_SLOW
- account_page(hashp, paddr, 1);
-#endif
-
- if (addr_type != A_BITMAP)
- page_init(hashp, pagep, paddr, HASH_PAGE);
-
- __put_page(hashp, pagep, addr_type, 1);
-
- return (0);
-}
-
-int32_t
-__delete_page(hashp, pagep, page_type)
- HTAB *hashp;
- PAGE16 *pagep;
- int32_t page_type;
-{
- if (page_type == A_OVFL)
- __free_ovflpage(hashp, pagep);
- return (mpool_delete(hashp->mp, pagep));
-}
-
-static u_int8_t
-is_bitmap_pgno(hashp, pgno)
- HTAB *hashp;
- db_pgno_t pgno;
-{
- int32_t i;
-
- for (i = 0; i < hashp->nmaps; i++)
- if (OADDR_TO_PAGE(hashp->hdr.bitmaps[i]) == pgno)
- return (1);
- return (0);
-}
-
-void
-__pgin_routine(pg_cookie, pgno, page)
- void *pg_cookie;
- db_pgno_t pgno;
- void *page;
-{
- HTAB *hashp;
- PAGE16 *pagep;
- int32_t max, i;
-
- pagep = (PAGE16 *)page;
- hashp = (HTAB *)pg_cookie;
-
- /*
- * There are the following cases for swapping:
- * 0) New page that may be unitialized.
- * 1) Bucket page or overflow page. Either swap
- * the header or initialize the page.
- * 2) Bitmap page. Swap the whole page!
- * 3) Header pages. Not handled here; these are written directly
- * to the file.
- */
-
- if (NUM_ENT(pagep) == 0 && NEXT_PGNO(pagep) == 0 &&
- !is_bitmap_pgno(hashp, pgno)) {
- /* XXX check for !0 LSN */
- page_init(hashp, pagep, pgno, HASH_PAGE);
- return;
- }
-
- if (hashp->hdr.lorder == DB_BYTE_ORDER)
- return;
- if (is_bitmap_pgno(hashp, pgno)) {
- max = hashp->hdr.bsize >> 2; /* divide by 4 bytes */
- for (i = 0; i < max; i++)
- M_32_SWAP(((int32_t *)pagep)[i]);
- } else
- swap_page_header_in(pagep);
-}
-
-void
-__pgout_routine(pg_cookie, pgno, page)
- void *pg_cookie;
- db_pgno_t pgno;
- void *page;
-{
- HTAB *hashp;
- PAGE16 *pagep;
- int32_t i, max;
-
- pagep = (PAGE16 *)page;
- hashp = (HTAB *)pg_cookie;
-
- /*
- * There are the following cases for swapping:
- * 1) Bucket page or overflow page. Just swap the header.
- * 2) Bitmap page. Swap the whole page!
- * 3) Header pages. Not handled here; these are written directly
- * to the file.
- */
-
- if (hashp->hdr.lorder == DB_BYTE_ORDER)
- return;
- if (is_bitmap_pgno(hashp, pgno)) {
- max = hashp->hdr.bsize >> 2; /* divide by 4 bytes */
- for (i = 0; i < max; i++)
- M_32_SWAP(((int32_t *)pagep)[i]);
- } else
- swap_page_header_out(pagep);
-}
-
-/*
- *
- * Returns:
- * 0 ==> OK
- * -1 ==>failure
- */
-extern int32_t
-__put_page(hashp, pagep, addr_type, is_dirty)
- HTAB *hashp;
- PAGE16 *pagep;
- int32_t addr_type, is_dirty;
-{
-#if DEBUG_SLOW
- account_page(hashp,
- ((BKT *)((char *)pagep - sizeof(BKT)))->pgno, -1);
-#endif
-
- return (mpool_put(hashp->mp, pagep, (is_dirty ? MPOOL_DIRTY : 0)));
-}
-
-/*
- * Returns:
- * 0 indicates SUCCESS
- * -1 indicates FAILURE
- */
-extern PAGE16 *
-__get_page(hashp, addr, addr_type)
- HTAB *hashp;
- u_int32_t addr;
- int32_t addr_type;
-{
- PAGE16 *pagep;
- db_pgno_t paddr;
-
- switch (addr_type) { /* Convert page number. */
- case A_BUCKET:
- paddr = BUCKET_TO_PAGE(addr);
- break;
- case A_OVFL:
- case A_BITMAP:
- paddr = OADDR_TO_PAGE(addr);
- break;
- default:
- paddr = addr;
- break;
- }
- pagep = (PAGE16 *)mpool_get(hashp->mp, paddr, 0);
-
-#if DEBUG_SLOW
- account_page(hashp, paddr, 1);
-#endif
-#ifdef DEBUG
- assert(ADDR(pagep) == paddr || ADDR(pagep) == 0 ||
- addr_type == A_BITMAP || addr_type == A_HEADER);
-#endif
-
- return (pagep);
-}
-
-static void
-swap_page_header_in(pagep)
- PAGE16 *pagep;
-{
- u_int32_t i;
-
- /* can leave type and filler alone, since they're 1-byte quantities */
-
- M_32_SWAP(PREV_PGNO(pagep));
- M_32_SWAP(NEXT_PGNO(pagep));
- M_16_SWAP(NUM_ENT(pagep));
- M_16_SWAP(OFFSET(pagep));
-
- for (i = 0; i < NUM_ENT(pagep); i++) {
- M_16_SWAP(KEY_OFF(pagep, i));
- M_16_SWAP(DATA_OFF(pagep, i));
- }
-}
-
-static void
-swap_page_header_out(pagep)
- PAGE16 *pagep;
-{
- u_int32_t i;
-
- for (i = 0; i < NUM_ENT(pagep); i++) {
- M_16_SWAP(KEY_OFF(pagep, i));
- M_16_SWAP(DATA_OFF(pagep, i))
- }
-
- /* can leave type and filler alone, since they're 1-byte quantities */
-
- M_32_SWAP(PREV_PGNO(pagep));
- M_32_SWAP(NEXT_PGNO(pagep));
- M_16_SWAP(NUM_ENT(pagep));
- M_16_SWAP(OFFSET(pagep));
-}
-
-#define BYTE_MASK ((1 << INT32_T_BYTE_SHIFT) -1)
-/*
- * Initialize a new bitmap page. Bitmap pages are left in memory
- * once they are read in.
- */
-extern int32_t
-__ibitmap(hashp, pnum, nbits, ndx)
- HTAB *hashp;
- int32_t pnum, nbits, ndx;
-{
- u_int32_t *ip;
- int32_t clearbytes, clearints;
-
- /* make a new bitmap page */
- if (__new_page(hashp, pnum, A_BITMAP) != 0)
- return (1);
- if (!(ip = (u_int32_t *)__get_page(hashp, pnum, A_BITMAP)))
- return (1);
- hashp->nmaps++;
- clearints = ((nbits - 1) >> INT32_T_BYTE_SHIFT) + 1;
- clearbytes = clearints << INT32_T_TO_BYTE;
- (void)memset((int8_t *)ip, 0, clearbytes);
- (void)memset((int8_t *)ip + clearbytes,
- 0xFF, hashp->hdr.bsize - clearbytes);
- ip[clearints - 1] = ALL_SET << (nbits & BYTE_MASK);
- SETBIT(ip, 0);
- hashp->hdr.bitmaps[ndx] = (u_int16_t)pnum;
- hashp->mapp[ndx] = ip;
- return (0);
-}
-
-static u_int32_t
-first_free(map)
- u_int32_t map;
-{
- u_int32_t i, mask;
-
- for (mask = 0x1, i = 0; i < BITS_PER_MAP; i++) {
- if (!(mask & map))
- return (i);
- mask = mask << 1;
- }
- return (i);
-}
-
-/*
- * returns 0 on error
- */
-static u_int16_t
-overflow_page(hashp)
- HTAB *hashp;
-{
- u_int32_t *freep;
- int32_t bit, first_page, free_bit, free_page, i, in_use_bits, j;
- int32_t max_free, offset, splitnum;
- u_int16_t addr;
-#ifdef DEBUG2
- int32_t tmp1, tmp2;
-#endif
-
- splitnum = hashp->hdr.ovfl_point;
- max_free = hashp->hdr.spares[splitnum];
-
- free_page = (max_free - 1) >> (hashp->hdr.bshift + BYTE_SHIFT);
- free_bit = (max_free - 1) & ((hashp->hdr.bsize << BYTE_SHIFT) - 1);
-
- /*
- * Look through all the free maps to find the first free block.
- * The compiler under -Wall will complain that freep may be used
- * before being set, however, this loop will ALWAYS get executed
- * at least once, so freep is guaranteed to be set.
- */
- first_page = hashp->hdr.last_freed >> (hashp->hdr.bshift + BYTE_SHIFT);
- for (i = first_page; i <= free_page; i++) {
- if (!(freep = fetch_bitmap(hashp, i)))
- return (0);
- if (i == free_page)
- in_use_bits = free_bit;
- else
- in_use_bits = (hashp->hdr.bsize << BYTE_SHIFT) - 1;
-
- if (i == first_page) {
- bit = hashp->hdr.last_freed &
- ((hashp->hdr.bsize << BYTE_SHIFT) - 1);
- j = bit / BITS_PER_MAP;
- bit = bit & ~(BITS_PER_MAP - 1);
- } else {
- bit = 0;
- j = 0;
- }
- for (; bit <= in_use_bits; j++, bit += BITS_PER_MAP)
- if (freep[j] != ALL_SET)
- goto found;
- }
-
- /* No Free Page Found */
- hashp->hdr.last_freed = hashp->hdr.spares[splitnum];
- hashp->hdr.spares[splitnum]++;
- offset = hashp->hdr.spares[splitnum] -
- (splitnum ? hashp->hdr.spares[splitnum - 1] : 0);
-
-#define OVMSG "HASH: Out of overflow pages. Increase page size\n"
-
- if (offset > SPLITMASK) {
- if (++splitnum >= NCACHED) {
- (void)write(STDERR_FILENO, OVMSG, sizeof(OVMSG) - 1);
- return (0);
- }
- hashp->hdr.ovfl_point = splitnum;
- hashp->hdr.spares[splitnum] = hashp->hdr.spares[splitnum - 1];
- hashp->hdr.spares[splitnum - 1]--;
- offset = 1;
- }
- /* Check if we need to allocate a new bitmap page. */
- if (free_bit == (hashp->hdr.bsize << BYTE_SHIFT) - 1) {
- free_page++;
- if (free_page >= NCACHED) {
- (void)write(STDERR_FILENO, OVMSG, sizeof(OVMSG) - 1);
- return (0);
- }
- /*
- * This is tricky. The 1 indicates that you want the new page
- * allocated with 1 clear bit. Actually, you are going to
- * allocate 2 pages from this map. The first is going to be
- * the map page, the second is the overflow page we were
- * looking for. The __ibitmap routine automatically, sets
- * the first bit of itself to indicate that the bitmap itself
- * is in use. We would explicitly set the second bit, but
- * don't have to if we tell __ibitmap not to leave it clear
- * in the first place.
- */
- if (__ibitmap(hashp,
- (int32_t)OADDR_OF(splitnum, offset), 1, free_page))
- return (0);
- hashp->hdr.spares[splitnum]++;
-#ifdef DEBUG2
- free_bit = 2;
-#endif
- offset++;
- if (offset > SPLITMASK) {
- if (++splitnum >= NCACHED) {
- (void)write(STDERR_FILENO,
- OVMSG, sizeof(OVMSG) - 1);
- return (0);
- }
- hashp->hdr.ovfl_point = splitnum;
- hashp->hdr.spares[splitnum] =
- hashp->hdr.spares[splitnum - 1];
- hashp->hdr.spares[splitnum - 1]--;
- offset = 0;
- }
- } else {
- /*
- * Free_bit addresses the last used bit. Bump it to address
- * the first available bit.
- */
- free_bit++;
- SETBIT(freep, free_bit);
- }
-
- /* Calculate address of the new overflow page */
- addr = OADDR_OF(splitnum, offset);
-#ifdef DEBUG2
- (void)fprintf(stderr, "OVERFLOW_PAGE: ADDR: %d BIT: %d PAGE %d\n",
- addr, free_bit, free_page);
-#endif
-
- if (OADDR_TO_PAGE(addr) > MAX_PAGES(hashp)) {
- (void)write(STDERR_FILENO, OVMSG, sizeof(OVMSG) - 1);
- return (0);
- }
- return (addr);
-
-found:
- bit = bit + first_free(freep[j]);
- SETBIT(freep, bit);
-#ifdef DEBUG2
- tmp1 = bit;
- tmp2 = i;
-#endif
- /*
- * Bits are addressed starting with 0, but overflow pages are addressed
- * beginning at 1. Bit is a bit address number, so we need to increment
- * it to convert it to a page number.
- */
- bit = 1 + bit + (i * (hashp->hdr.bsize << BYTE_SHIFT));
- if (bit >= hashp->hdr.last_freed)
- hashp->hdr.last_freed = bit - 1;
-
- /* Calculate the split number for this page */
- for (i = 0; i < splitnum && (bit > hashp->hdr.spares[i]); i++);
- offset = (i ? bit - hashp->hdr.spares[i - 1] : bit);
- if (offset >= SPLITMASK)
- return (0); /* Out of overflow pages */
- addr = OADDR_OF(i, offset);
-#ifdef DEBUG2
- (void)fprintf(stderr, "OVERFLOW_PAGE: ADDR: %d BIT: %d PAGE %d\n",
- addr, tmp1, tmp2);
-#endif
-
- if (OADDR_TO_PAGE(addr) > MAX_PAGES(hashp)) {
- (void)write(STDERR_FILENO, OVMSG, sizeof(OVMSG) - 1);
- return (0);
- }
- /* Allocate and return the overflow page */
- return (addr);
-}
-
-#ifdef DEBUG
-int
-bucket_to_page(hashp, n)
- HTAB *hashp;
- int n;
-{
- int ret_val;
-
- ret_val = n + hashp->hdr.hdrpages;
- if (n != 0)
- ret_val += hashp->hdr.spares[__log2(n + 1) - 1];
- return (ret_val);
-}
-
-int32_t
-oaddr_to_page(hashp, n)
- HTAB *hashp;
- int n;
-{
- int ret_val, temp;
-
- temp = (1 << SPLITNUM(n)) - 1;
- ret_val = bucket_to_page(hashp, temp);
- ret_val += (n & SPLITMASK);
-
- return (ret_val);
-}
-#endif /* DEBUG */
-
-static indx_t
-page_to_oaddr(hashp, pgno)
- HTAB *hashp;
- db_pgno_t pgno;
-{
- int32_t sp, ret_val;
-
- /*
- * To convert page number to overflow address:
- *
- * 1. Find a starting split point -- use 0 since there are only
- * 32 split points.
- * 2. Find the split point s.t. 2^sp + hdr.spares[sp] < pgno and
- * 2^(sp+1) = hdr.spares[sp+1] > pgno. The overflow address will
- * be located at sp.
- * 3. return...
- */
- pgno -= hashp->hdr.hdrpages;
- for (sp = 0; sp < NCACHED; sp++)
- if (POW2(sp) + hashp->hdr.spares[sp] < pgno &&
- (POW2(sp + 1) + hashp->hdr.spares[sp + 1]) > pgno)
- break;
-
- ret_val = OADDR_OF(sp + 1,
- pgno - ((POW2(sp + 1) - 1) + hashp->hdr.spares[sp]));
-#ifdef DEBUG
- assert(OADDR_TO_PAGE(ret_val) == (pgno + hashp->hdr.hdrpages));
-#endif
- return (ret_val);
-}
-
-/*
- * Mark this overflow page as free.
- */
-extern void
-__free_ovflpage(hashp, pagep)
- HTAB *hashp;
- PAGE16 *pagep;
-{
- u_int32_t *freep;
- int32_t bit_address, free_page, free_bit;
- u_int16_t addr, ndx;
-
- addr = page_to_oaddr(hashp, ADDR(pagep));
-
-#ifdef DEBUG2
- (void)fprintf(stderr, "Freeing %d\n", addr);
-#endif
- ndx = ((u_int16_t)addr) >> SPLITSHIFT;
- bit_address =
- (ndx ? hashp->hdr.spares[ndx - 1] : 0) + (addr & SPLITMASK) - 1;
- if (bit_address < hashp->hdr.last_freed)
- hashp->hdr.last_freed = bit_address;
- free_page = (bit_address >> (hashp->hdr.bshift + BYTE_SHIFT));
- free_bit = bit_address & ((hashp->hdr.bsize << BYTE_SHIFT) - 1);
-
- freep = fetch_bitmap(hashp, free_page);
-#ifdef DEBUG
- /*
- * This had better never happen. It means we tried to read a bitmap
- * that has already had overflow pages allocated off it, and we
- * failed to read it from the file.
- */
- if (!freep)
- assert(0);
-#endif
- CLRBIT(freep, free_bit);
-#ifdef DEBUG2
- (void)fprintf(stderr, "FREE_OVFLPAGE: ADDR: %d BIT: %d PAGE %d\n",
- obufp->addr, free_bit, free_page);
-#endif
-}
-
-static u_int32_t *
-fetch_bitmap(hashp, ndx)
- HTAB *hashp;
- int32_t ndx;
-{
- if (ndx >= hashp->nmaps)
- return (NULL);
- if (!hashp->mapp[ndx])
- hashp->mapp[ndx] = (u_int32_t *)__get_page(hashp,
- hashp->hdr.bitmaps[ndx], A_BITMAP);
-
- return (hashp->mapp[ndx]);
-}
-
-#ifdef DEBUG_SLOW
-static void
-account_page(hashp, pgno, inout)
- HTAB *hashp;
- db_pgno_t pgno;
- int inout;
-{
- static struct {
- db_pgno_t pgno;
- int times;
- } list[100];
- static int last;
- int i, j;
-
- if (inout == -1) /* XXX: Kluge */
- inout = 0;
-
- /* Find page in list. */
- for (i = 0; i < last; i++)
- if (list[i].pgno == pgno)
- break;
- /* Not found. */
- if (i == last) {
- list[last].times = inout;
- list[last].pgno = pgno;
- last++;
- }
- list[i].times = inout;
- if (list[i].times == 0) {
- for (j = i; j < last; j++)
- list[j] = list[j + 1];
- last--;
- }
- for (i = 0; i < last; i++, list[i].times++)
- if (list[i].times > 20 && !is_bitmap_pgno(hashp, list[i].pgno))
- (void)fprintf(stderr,
- "Warning: pg %d has been out for %d times\n",
- list[i].pgno, list[i].times);
-}
-#endif /* DEBUG_SLOW */
diff --git a/src/util/db2/hash/hsearch.c b/src/util/db2/hash/hsearch.c
deleted file mode 100644
index 02ff7ef843..0000000000
--- a/src/util/db2/hash/hsearch.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Margo Seltzer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)hsearch.c 8.5 (Berkeley) 9/21/94";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-
-#include <fcntl.h>
-#include <string.h>
-
-#include "db-int.h"
-#include "search.h"
-
-static DB *dbp = NULL;
-static ENTRY retval;
-
-extern int
-hcreate(nel)
- u_int nel;
-{
- HASHINFO info;
-
- info.nelem = nel;
- info.bsize = 256;
- info.ffactor = 8;
- info.cachesize = 0;
- info.hash = NULL;
- info.lorder = 0;
- dbp = (DB *)__hash_open(NULL, O_CREAT | O_RDWR | O_BINARY, 0600, &info, 0);
- return (dbp != NULL);
-}
-
-extern ENTRY *
-hsearch(item, action)
- ENTRY item;
- ACTION action;
-{
- DBT key, val;
- int status;
-
- if (!dbp)
- return (NULL);
- key.data = (u_char *)item.key;
- key.size = strlen(item.key) + 1;
-
- if (action == ENTER) {
- val.data = (u_char *)item.data;
- val.size = strlen(item.data) + 1;
- status = (dbp->put)(dbp, &key, &val, R_NOOVERWRITE);
- if (status)
- return (NULL);
- } else {
- /* FIND */
- status = (dbp->get)(dbp, &key, &val, 0);
- if (status)
- return (NULL);
- else
- item.data = (char *)val.data;
- }
- retval.key = item.key;
- retval.data = item.data;
- return (&retval);
-}
-
-extern void
-hdestroy()
-{
- if (dbp) {
- (void)(dbp->close)(dbp);
- dbp = NULL;
- }
-}
diff --git a/src/util/db2/hash/page.h b/src/util/db2/hash/page.h
deleted file mode 100644
index 8ef8a2e294..0000000000
--- a/src/util/db2/hash/page.h
+++ /dev/null
@@ -1,178 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Margo Seltzer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)page.h 8.4 (Berkeley) 11/7/95
- */
-
-#define HI_MASK 0xFFFF0000
-#define LO_MASK (~HI_MASK)
-
-#define HI(N) ((u_int16_t)(((N) & HI_MASK) >> 16))
-#define LO(N) ((u_int16_t)((N) & LO_MASK))
-
-/* Constants for big key page overhead information. */
-#define NUMSHORTS 0
-#define KEYLEN 1
-#define DATALEN 2
-#define NEXTPAGE 3
-
-/*
- * Hash pages store meta-data beginning at the top of the page (offset 0)
- * and key/data values beginning at the bottom of the page (offset pagesize).
- * Fields are always accessed via macros so that we can change the page
- * format without too much pain. The only changes that will require massive
- * code changes are if we no longer store key/data offsets next to each
- * other (since we use that fact to compute key lengths). In the accessor
- * macros below, P means a pointer to the page, I means an index of the
- * particular entry being accessed.
- *
- * Hash base page format
- * BYTE ITEM NBYTES TYPE ACCESSOR MACRO
- * ---- ------------------ ------ -------- --------------
- * 0 previous page number 4 db_pgno_t PREV_PGNO(P)
- * 4 next page number 4 db_pgno_t NEXT_PGNO(P)
- * 8 # pairs on page 2 indx_t NUM_ENT(P)
- * 10 page type 1 u_int8_t TYPE(P)
- * 11 padding 1 u_int8_t none
- * 12 highest free byte 2 indx_t OFFSET(P)
- * 14 key offset 0 2 indx_t KEY_OFF(P, I)
- * 16 data offset 0 2 indx_t DATA_OFF(P, I)
- * 18 key offset 1 2 indx_t KEY_OFF(P, I)
- * 20 data offset 1 2 indx_t DATA_OFF(P, I)
- * ...etc...
- */
-
-/* Indices (in bytes) of the beginning of each of these entries */
-#define I_PREV_PGNO 0
-#define I_NEXT_PGNO 4
-#define I_ENTRIES 8
-#define I_TYPE 10
-#define I_HF_OFFSET 12
-
-/* Overhead is everything prior to the first key/data pair. */
-#define PAGE_OVERHEAD (I_HF_OFFSET + sizeof(indx_t))
-
-/* To allocate a pair, we need room for one key offset and one data offset. */
-#define PAIR_OVERHEAD ((sizeof(indx_t) << 1))
-
-/* Use this macro to extract a value of type T from page P at offset O. */
-#define REFERENCE(P, T, O) (((T *)((u_int8_t *)(P) + O))[0])
-
-/*
- * Use these macros to access fields on a page; P is a PAGE16 *.
- */
-#define NUM_ENT(P) (REFERENCE((P), indx_t, I_ENTRIES))
-#define PREV_PGNO(P) (REFERENCE((P), db_pgno_t, I_PREV_PGNO))
-#define NEXT_PGNO(P) (REFERENCE((P), db_pgno_t, I_NEXT_PGNO))
-#define TYPE(P) (REFERENCE((P), u_int8_t, I_TYPE))
-#define OFFSET(P) (REFERENCE((P), indx_t, I_HF_OFFSET))
-/*
- * We need to store a page's own address on each page (unlike the Btree
- * access method which needs the previous page). We use the PREV_PGNO
- * field to store our own page number.
- */
-#define ADDR(P) (PREV_PGNO((P)))
-
-/* Extract key/data offsets and data for a given index. */
-#define DATA_OFF(P, N) \
- REFERENCE(P, indx_t, PAGE_OVERHEAD + N * PAIR_OVERHEAD + sizeof(indx_t))
-#define KEY_OFF(P, N) \
- REFERENCE(P, indx_t, PAGE_OVERHEAD + N * PAIR_OVERHEAD)
-
-#define KEY(P, N) (((PAGE8 *)(P)) + KEY_OFF((P), (N)))
-#define DATA(P, N) (((PAGE8 *)(P)) + DATA_OFF((P), (N)))
-
-/*
- * Macros used to compute various sizes on a page.
- */
-#define PAIRSIZE(K, D) (PAIR_OVERHEAD + (K)->size + (D)->size)
-#define BIGOVERHEAD (4 * sizeof(u_int16_t))
-#define KEYSIZE(K) (4 * sizeof(u_int16_t) + (K)->size);
-#define OVFLSIZE (2 * sizeof(u_int16_t))
-#define BIGPAGEOVERHEAD (4 * sizeof(u_int16_t))
-#define BIGPAGEOFFSET 4
-#define BIGPAGESIZE(P) ((P)->BSIZE - BIGPAGEOVERHEAD)
-
-#define PAGE_META(N) (((N) + 3) * sizeof(u_int16_t))
-#define MINFILL 0.75
-#define ISBIG(N, P) (((N) > ((P)->hdr.bsize * MINFILL)) ? 1 : 0)
-
-#define ITEMSIZE(I) (sizeof(u_int16_t) + (I)->size)
-
-/*
- * Big key/data pages use a different page format. They have a single
- * key/data "pair" containing the length of the key and data instead
- * of offsets.
- */
-#define BIGKEYLEN(P) (KEY_OFF((P), 0))
-#define BIGDATALEN(P) (DATA_OFF((P), 0))
-#define BIGKEY(P) (((PAGE8 *)(P)) + PAGE_OVERHEAD + PAIR_OVERHEAD)
-#define BIGDATA(P) \
- (((PAGE8 *)(P)) + PAGE_OVERHEAD + PAIR_OVERHEAD + KEY_OFF((P), 0))
-
-
-#define OVFLPAGE 0
-#define BIGPAIR 0
-#define INVALID_PGNO 0xFFFFFFFF
-
-typedef unsigned short PAGE16;
-typedef unsigned char PAGE8;
-
-#define A_BUCKET 0
-#define A_OVFL 1
-#define A_BITMAP 2
-#define A_RAW 4
-#define A_HEADER 5
-
-#define PAIRFITS(P,K,D) ((PAIRSIZE((K),(D))) <= FREESPACE((P)))
-#define BIGPAIRFITS(P) ((FREESPACE((P)) >= PAIR_OVERHEAD))
-/*
- * Since these are all unsigned, we need to guarantee that we never go
- * negative. Offset values are 0-based and overheads are one based (i.e.
- * one byte of overhead is 1, not 0), so we need to convert OFFSETs to
- * 1-based counting before subtraction.
- */
-#define FREESPACE(P) \
- ((OFFSET((P)) + 1 - PAGE_OVERHEAD - (NUM_ENT((P)) * PAIR_OVERHEAD)))
-
-/*
- * Overhead on header pages is just one word -- the length of the
- * header info stored on that page.
- */
-#define HEADER_OVERHEAD 4
-
-#define HASH_PAGE 2
-#define HASH_BIGPAGE 3
-#define HASH_OVFLPAGE 4
diff --git a/src/util/db2/hash/page.h.patch b/src/util/db2/hash/page.h.patch
deleted file mode 100644
index 4a0311fea3..0000000000
--- a/src/util/db2/hash/page.h.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-*** /tmp/,RCSt1a21720 Wed Apr 3 11:49:55 1996
---- page.h Wed Apr 3 08:42:25 1996
-***************
-*** 158,163
-
- #define PAIRFITS(P,K,D) ((PAIRSIZE((K),(D))) <= FREESPACE((P)))
- #define BIGPAIRFITS(P) ((FREESPACE((P)) >= PAIR_OVERHEAD))
- #define FREESPACE(P) \
- ((OFFSET((P)) - PAGE_OVERHEAD - (NUM_ENT((P)) * PAIR_OVERHEAD)))
-
-
---- 158,169 -----
-
- #define PAIRFITS(P,K,D) ((PAIRSIZE((K),(D))) <= FREESPACE((P)))
- #define BIGPAIRFITS(P) ((FREESPACE((P)) >= PAIR_OVERHEAD))
-+ /*
-+ * Since these are all unsigned, we need to guarantee that we never go
-+ * negative. Offset values are 0-based and overheads are one based (i.e.
-+ * one byte of overhead is 1, not 0), so we need to convert OFFSETs to
-+ * 1-based counting before subtraction.
-+ */
- #define FREESPACE(P) \
- ((OFFSET((P)) + 1 - PAGE_OVERHEAD - (NUM_ENT((P)) * PAIR_OVERHEAD)))
-
-***************
-*** 159,165
- #define PAIRFITS(P,K,D) ((PAIRSIZE((K),(D))) <= FREESPACE((P)))
- #define BIGPAIRFITS(P) ((FREESPACE((P)) >= PAIR_OVERHEAD))
- #define FREESPACE(P) \
-! ((OFFSET((P)) - PAGE_OVERHEAD - (NUM_ENT((P)) * PAIR_OVERHEAD)))
-
- /*
- * Overhead on header pages is just one word -- the length of the
-
---- 165,171 -----
- * 1-based counting before subtraction.
- */
- #define FREESPACE(P) \
-! ((OFFSET((P)) + 1 - PAGE_OVERHEAD - (NUM_ENT((P)) * PAIR_OVERHEAD)))
-
- /*
- * Overhead on header pages is just one word -- the length of the
diff --git a/src/util/db2/hash/search.h b/src/util/db2/hash/search.h
deleted file mode 100644
index 6d6a0a82f4..0000000000
--- a/src/util/db2/hash/search.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Margo Seltzer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)search.h 8.1 (Berkeley) 6/4/93
- */
-
-/* Backward compatibility to hsearch interface. */
-typedef struct entry {
- char *key;
- char *data;
-} ENTRY;
-
-typedef enum {
- FIND, ENTER
-} ACTION;
-
-#define hcreate kdb2_hcreate
-#define hdestroy kdb2_hdestroy
-#define hsearch kdb2_hsearch
-
-int hcreate __P((unsigned int));
-void hdestroy __P((void));
-ENTRY *hsearch __P((ENTRY, ACTION));
diff --git a/src/util/db2/include/ChangeLog b/src/util/db2/include/ChangeLog
deleted file mode 100644
index 676bbd44a7..0000000000
--- a/src/util/db2/include/ChangeLog
+++ /dev/null
@@ -1,74 +0,0 @@
-2004-05-23 Ken Raeburn <raeburn@mit.edu>
-
- * db-int.h: Include sys/param.h if available.
-
-2004-05-07 Ken Raeburn <raeburn@mit.edu>
-
- * db-int.h: Include machine/endian.h if available. Check for
- __LITTLE_ENDIAN__ and __BIG_ENDIAN__, _MIPSEB and _MIPSEL.
-
-2004-05-05 Ken Raeburn <raeburn@mit.edu>
-
- * db-int.h: Include stdlib.h, and endian.h if available.
- (LITTLE_ENDIAN, BIG_ENDIAN, BYTE_ORDER): If not defined, and if
- versions with one or two leading underscores are defined, define
- the no-underscore form in terms of the with-underscore one.
- (DB_BYTE_ORDER): Define by checking LITTLE_ENDIAN, BIG_ENDIAN, and
- BYTE_ORDER; report an error if that doesn't work. Don't check
- WORDS_BIGENDIAN.
-
-2002-09-05 Ken Raeburn <raeburn@mit.edu>
-
- * db-int.h: If stdint.h or inttypes.h are found, include them.
-
-2002-08-23 Tom Yu <tlyu@mit.edu>
-
- * db.h: Add rename and prototype for bt_rseq(); this is a kludge
- to avoid stuffing more things into the DB handle.
-
-2001-10-24 Ezra Peisach <epeisach@mit.edu>
-
- * db-config.h.in: Remove unnecessary definitions for including
- db.h header file. These include WORDS_BIGENDIAN, ssize_t, u_short,
- int8_t, u_int8_t, int16_t, u_int16_t, int32_t.
-
-2001-07-06 Ezra Peisach <epeisach@mit.edu>
-
- * db-dbm.h: New header file which lists the dbm interfaces.
-
- * db-ndbm.h: Change prototype from dirinfo to dirfno which matches
- code and ndbm API.
-
-2000-07-01 Tom Yu <tlyu@mit.edu>
-
- * db-config.h.in: New file; contains useful tidbits from
- config.h.in generated by autoheader. It is needed because
- config.h.in has some thing we don't want to leak, like renaming of
- missing libc functions.
-
- * .cvsignore: Twiddle to reflect current reality.
-
- * db-int.h: #include config.h since db.h includes db-config.h
- which is not quite the same now.
-
-2000-06-30 Tom Yu <tlyu@mit.edu>
-
- * db-int.h: Remove renaming for memmove, strerror, mkstemp since
- this is now done by the build system.
-
-Fri Feb 13 14:39:25 1998 Tom Yu <tlyu@mit.edu>
-
- * db-int.h: Additional renaming.
-
- * db.h: Rename dbopen to avoid collision with NetBSD libc.
-
- * db-ndbm.h: Rename lots of functions to avoid collisions with
- native dbm implementations.
-
- * db-int.h: Rename __hash_open to avoid potential collision with
- NetBSD libc.
-
-Thu Aug 15 15:41:12 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
-
- * db-ndbm.h: Add prototypes for missing functions dbm_error() and
- dbm_clearerror().
diff --git a/src/util/db2/include/db-config.h.in b/src/util/db2/include/db-config.h.in
deleted file mode 100644
index bcd7991b34..0000000000
--- a/src/util/db2/include/db-config.h.in
+++ /dev/null
@@ -1,16 +0,0 @@
-/* include/db-config.h.in. Derived from autoconf-generated config.h.in. */
-
-/* Define to empty if the keyword does not work. */
-#undef const
-
-/* Define to `unsigned' if <sys/types.h> doesn't define. */
-#undef size_t
-
-#undef u_char
-#undef u_int
-#undef u_long
-
-#undef u_int32_t
-
-/* The number of bytes in a int. */
-#undef SIZEOF_INT
diff --git a/src/util/db2/include/db-dbm.h b/src/util/db2/include/db-dbm.h
deleted file mode 100644
index 28c93786cd..0000000000
--- a/src/util/db2/include/db-dbm.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef _DBM_H_
-#define _DBM_H_
-
-#include "db.h"
-
-#define dbminit kdb2_dbminit
-#define fetch kdb2_fetch
-#define firstkey kdb2_firstkey
-#define nextkey kdb2_nextkey
-#define delete kdb2_delete
-#define store kdb2_store
-
-__BEGIN_DECLS
-int dbminit __P((char *));
-datum fetch __P((datum));
-datum firstkey __P((void));
-datum nextkey __P((datum));
-int delete __P((datum));
-int store __P((datum, datum));
-__END_DECLS
-
-
-#endif
diff --git a/src/util/db2/include/db-int.h b/src/util/db2/include/db-int.h
deleted file mode 100644
index bbb22925aa..0000000000
--- a/src/util/db2/include/db-int.h
+++ /dev/null
@@ -1,283 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)compat.h 8.13 (Berkeley) 2/21/94
- */
-
-#ifndef _DB_INT_H_
-#define _DB_INT_H_
-
-#include "config.h"
-#include "db.h"
-
-/* deal with autoconf-based stuff */
-
-#define DB_LITTLE_ENDIAN 1234
-#define DB_BIG_ENDIAN 4321
-
-#include <stdlib.h>
-#ifdef HAVE_ENDIAN_H
-# include <endian.h>
-#endif
-#ifdef HAVE_MACHINE_ENDIAN_H
-# include <machine/endian.h>
-#endif
-#ifdef HAVE_SYS_PARAM_H
-# include <sys/param.h>
-#endif
-/* Handle both BIG and LITTLE defined and BYTE_ORDER matches one, or
- just one defined; both with and without leading underscores.
-
- Ignore "PDP endian" machines, this code doesn't support them
- anyways. */
-#if !defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN) && !defined(BYTE_ORDER)
-# ifdef __LITTLE_ENDIAN__
-# define LITTLE_ENDIAN __LITTLE_ENDIAN__
-# endif
-# ifdef __BIG_ENDIAN__
-# define BIG_ENDIAN __BIG_ENDIAN__
-# endif
-#endif
-#if !defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN) && !defined(BYTE_ORDER)
-# ifdef _LITTLE_ENDIAN
-# define LITTLE_ENDIAN _LITTLE_ENDIAN
-# endif
-# ifdef _BIG_ENDIAN
-# define BIG_ENDIAN _BIG_ENDIAN
-# endif
-# ifdef _BYTE_ORDER
-# define BYTE_ORDER _BYTE_ORDER
-# endif
-#endif
-#if !defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN) && !defined(BYTE_ORDER)
-# ifdef __LITTLE_ENDIAN
-# define LITTLE_ENDIAN __LITTLE_ENDIAN
-# endif
-# ifdef __BIG_ENDIAN
-# define BIG_ENDIAN __BIG_ENDIAN
-# endif
-# ifdef __BYTE_ORDER
-# define BYTE_ORDER __BYTE_ORDER
-# endif
-#endif
-
-#if defined(_MIPSEL) && !defined(LITTLE_ENDIAN)
-# define LITTLE_ENDIAN
-#endif
-#if defined(_MIPSEB) && !defined(BIG_ENDIAN)
-# define BIG_ENDIAN
-#endif
-
-#if defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN) && defined(BYTE_ORDER)
-# if LITTLE_ENDIAN == BYTE_ORDER
-# define DB_BYTE_ORDER DB_LITTLE_ENDIAN
-# elif BIG_ENDIAN == BYTE_ORDER
-# define DB_BYTE_ORDER DB_BIG_ENDIAN
-# else
-# error "LITTLE_ENDIAN and BIG_ENDIAN defined, but can't determine byte order"
-# endif
-#elif defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
-# define DB_BYTE_ORDER DB_LITTLE_ENDIAN
-#elif defined(BIG_ENDIAN) && !defined(LITTLE_ENDIAN)
-# define DB_BYTE_ORDER DB_BIG_ENDIAN
-#else
-# error "can't determine byte order from included system headers"
-#endif
-
-#if 0
-#ifdef WORDS_BIGENDIAN
-#define DB_BYTE_ORDER DB_BIG_ENDIAN
-#else
-#define DB_BYTE_ORDER DB_LITTLE_ENDIAN
-#endif
-#endif
-
-/* end autoconf-based stuff */
-
-/* include necessary system header files */
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <limits.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <errno.h>
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-/* Tru64 5.1: int8_t is defined here, and stdint.h doesn't exist. */
-#include <inttypes.h>
-#endif
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/param.h>
-
-/* types and constants used for database structure */
-
-#define MAX_PAGE_NUMBER 0xffffffff /* >= # of pages in a file */
-typedef u_int32_t db_pgno_t;
-#define MAX_PAGE_OFFSET 65535 /* >= # of bytes in a page */
-typedef u_int16_t indx_t;
-#define MAX_REC_NUMBER 0xffffffff /* >= # of records in a tree */
-typedef u_int32_t recno_t;
-
-/*
- * Little endian <==> big endian 32-bit swap macros.
- * M_32_SWAP swap a memory location
- * P_32_SWAP swap a referenced memory location
- * P_32_COPY swap from one location to another
- */
-#define M_32_SWAP(a) { \
- u_int32_t _tmp = a; \
- ((char *)&a)[0] = ((char *)&_tmp)[3]; \
- ((char *)&a)[1] = ((char *)&_tmp)[2]; \
- ((char *)&a)[2] = ((char *)&_tmp)[1]; \
- ((char *)&a)[3] = ((char *)&_tmp)[0]; \
-}
-#define P_32_SWAP(a) { \
- u_int32_t _tmp = *(u_int32_t *)a; \
- ((char *)a)[0] = ((char *)&_tmp)[3]; \
- ((char *)a)[1] = ((char *)&_tmp)[2]; \
- ((char *)a)[2] = ((char *)&_tmp)[1]; \
- ((char *)a)[3] = ((char *)&_tmp)[0]; \
-}
-#define P_32_COPY(a, b) { \
- ((char *)&(b))[0] = ((char *)&(a))[3]; \
- ((char *)&(b))[1] = ((char *)&(a))[2]; \
- ((char *)&(b))[2] = ((char *)&(a))[1]; \
- ((char *)&(b))[3] = ((char *)&(a))[0]; \
-}
-
-/*
- * Little endian <==> big endian 16-bit swap macros.
- * M_16_SWAP swap a memory location
- * P_16_SWAP swap a referenced memory location
- * P_16_COPY swap from one location to another
- */
-#define M_16_SWAP(a) { \
- u_int16_t _tmp = a; \
- ((char *)&a)[0] = ((char *)&_tmp)[1]; \
- ((char *)&a)[1] = ((char *)&_tmp)[0]; \
-}
-#define P_16_SWAP(a) { \
- u_int16_t _tmp = *(u_int16_t *)a; \
- ((char *)a)[0] = ((char *)&_tmp)[1]; \
- ((char *)a)[1] = ((char *)&_tmp)[0]; \
-}
-#define P_16_COPY(a, b) { \
- ((char *)&(b))[0] = ((char *)&(a))[1]; \
- ((char *)&(b))[1] = ((char *)&(a))[0]; \
-}
-
-/* open functions for each database type, used in dbopen() */
-
-#define __bt_open __kdb2_bt_open
-#define __hash_open __kdb2_hash_open
-#define __rec_open __kdb2_rec_open
-#define __dbpanic __kdb2_dbpanic
-
-DB *__bt_open __P((const char *, int, int, const BTREEINFO *, int));
-DB *__hash_open __P((const char *, int, int, const HASHINFO *, int));
-DB *__rec_open __P((const char *, int, int, const RECNOINFO *, int));
-void __dbpanic __P((DB *dbp));
-
-/*
- * There is no portable way to figure out the maximum value of a file
- * offset, so we put it here.
- */
-#ifdef OFF_T_MAX
-#define DB_OFF_T_MAX OFF_T_MAX
-#else
-#define DB_OFF_T_MAX LONG_MAX
-#endif
-
-#ifndef O_ACCMODE /* POSIX 1003.1 access mode mask. */
-#define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR)
-#endif
-
-/*
- * If you can't provide lock values in the open(2) call. Note, this
- * allows races to happen.
- */
-#ifndef O_EXLOCK /* 4.4BSD extension. */
-#define O_EXLOCK 0
-#endif
-
-#ifndef O_SHLOCK /* 4.4BSD extension. */
-#define O_SHLOCK 0
-#endif
-
-#ifndef EFTYPE
-#define EFTYPE EINVAL /* POSIX 1003.1 format errno. */
-#endif
-
-#ifndef STDERR_FILENO
-#define STDIN_FILENO 0 /* ANSI C #defines */
-#define STDOUT_FILENO 1
-#define STDERR_FILENO 2
-#endif
-
-#ifndef SEEK_END
-#define SEEK_SET 0 /* POSIX 1003.1 seek values */
-#define SEEK_CUR 1
-#define SEEK_END 2
-#endif
-
-#ifndef NULL /* ANSI C #defines NULL everywhere. */
-#define NULL 0
-#endif
-
-#ifndef MAX /* Usually found in <sys/param.h>. */
-#define MAX(_a,_b) ((_a)<(_b)?(_b):(_a))
-#endif
-#ifndef MIN /* Usually found in <sys/param.h>. */
-#define MIN(_a,_b) ((_a)<(_b)?(_a):(_b))
-#endif
-
-#ifndef S_ISDIR /* POSIX 1003.1 file type tests. */
-#define S_ISDIR(m) ((m & 0170000) == 0040000) /* directory */
-#define S_ISCHR(m) ((m & 0170000) == 0020000) /* char special */
-#define S_ISBLK(m) ((m & 0170000) == 0060000) /* block special */
-#define S_ISREG(m) ((m & 0170000) == 0100000) /* regular file */
-#define S_ISFIFO(m) ((m & 0170000) == 0010000) /* fifo */
-#endif
-#ifndef S_ISLNK /* BSD POSIX 1003.1 extensions */
-#define S_ISLNK(m) ((m & 0170000) == 0120000) /* symbolic link */
-#define S_ISSOCK(m) ((m & 0170000) == 0140000) /* socket */
-#endif
-
-#ifndef O_BINARY
-#define O_BINARY 0 /* Needed for Win32 compiles */
-#endif
-#endif /* _DB_INT_H_ */
diff --git a/src/util/db2/include/db-ndbm.h b/src/util/db2/include/db-ndbm.h
deleted file mode 100644
index e99f46fdc9..0000000000
--- a/src/util/db2/include/db-ndbm.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Margo Seltzer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ndbm.h 8.1 (Berkeley) 6/2/93
- */
-
-#ifndef _NDBM_H_
-#define _NDBM_H_
-
-#include "db.h"
-
-/* Map dbm interface onto db(3). */
-#define DBM_RDONLY O_RDONLY
-
-/* Flags to dbm_store(). */
-#define DBM_INSERT 0
-#define DBM_REPLACE 1
-
-/*
- * The db(3) support for ndbm(3) always appends this suffix to the
- * file name to avoid overwriting the user's original database.
- */
-#define DBM_SUFFIX ".db"
-
-typedef struct {
- char *dptr;
- int dsize;
-} datum;
-
-typedef DB DBM;
-#define dbm_pagfno(a) DBM_PAGFNO_NOT_AVAILABLE
-
-#define dbm_close kdb2_dbm_close
-#define dbm_delete kdb2_dbm_delete
-#define dbm_fetch kdb2_dbm_fetch
-#define dbm_firstkey kdb2_dbm_firstkey
-#define dbm_forder kdb2_dbm_forder
-#define dbm_nextkey kdb2_dbm_nextkey
-#define dbm_open kdb2_dbm_open
-#define dbm_store kdb2_dbm_store
-#define dbm_dirfno kdb2_dbm_dirfno
-#define dbm_error kdb2_dbm_error
-#define dbm_clearerr kdb2_dbm_clearerr
-
-__BEGIN_DECLS
-void dbm_close __P((DBM *));
-int dbm_delete __P((DBM *, datum));
-datum dbm_fetch __P((DBM *, datum));
-datum dbm_firstkey __P((DBM *));
-long dbm_forder __P((DBM *, datum));
-datum dbm_nextkey __P((DBM *));
-DBM *dbm_open __P((const char *, int, int));
-int dbm_store __P((DBM *, datum, datum, int));
-int dbm_dirfno __P((DBM *));
-int dbm_error __P((DBM *db));
-int dbm_clearerr __P((DBM *db));
-__END_DECLS
-
-#endif /* !_NDBM_H_ */
diff --git a/src/util/db2/include/db-queue.h b/src/util/db2/include/db-queue.h
deleted file mode 100644
index 40d32ccb6e..0000000000
--- a/src/util/db2/include/db-queue.h
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)queue.h 8.3 (Berkeley) 12/13/93
- */
-
-#ifndef _QUEUE_H_
-#define _QUEUE_H_
-
-/*
- * This file defines three types of data structures: lists, tail queues,
- * and circular queues.
- *
- * A list is headed by a single forward pointer (or an array of forward
- * pointers for a hash table header). The elements are doubly linked
- * so that an arbitrary element can be removed without a need to
- * traverse the list. New elements can be added to the list after
- * an existing element or at the head of the list. A list may only be
- * traversed in the forward direction.
- *
- * A tail queue is headed by a pair of pointers, one to the head of the
- * list and the other to the tail of the list. The elements are doubly
- * linked so that an arbitrary element can be removed without a need to
- * traverse the list. New elements can be added to the list after
- * an existing element, at the head of the list, or at the end of the
- * list. A tail queue may only be traversed in the forward direction.
- *
- * A circle queue is headed by a pair of pointers, one to the head of the
- * list and the other to the tail of the list. The elements are doubly
- * linked so that an arbitrary element can be removed without a need to
- * traverse the list. New elements can be added to the list before or after
- * an existing element, at the head of the list, or at the end of the list.
- * A circle queue may be traversed in either direction, but has a more
- * complex end of list detection.
- *
- * For details on the use of these macros, see the queue(3) manual page.
- */
-
-/*
- * List definitions.
- */
-#define LIST_HEAD(name, type) \
-struct name { \
- struct type *lh_first; /* first element */ \
-}
-
-#define LIST_ENTRY(type) \
-struct { \
- struct type *le_next; /* next element */ \
- struct type **le_prev; /* address of previous next element */ \
-}
-
-/*
- * List functions.
- */
-#define LIST_INIT(head) { \
- (head)->lh_first = NULL; \
-}
-
-#define LIST_INSERT_AFTER(listelm, elm, field) { \
- if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \
- (listelm)->field.le_next->field.le_prev = \
- &(elm)->field.le_next; \
- (listelm)->field.le_next = (elm); \
- (elm)->field.le_prev = &(listelm)->field.le_next; \
-}
-
-#define LIST_INSERT_HEAD(head, elm, field) { \
- if (((elm)->field.le_next = (head)->lh_first) != NULL) \
- (head)->lh_first->field.le_prev = &(elm)->field.le_next;\
- (head)->lh_first = (elm); \
- (elm)->field.le_prev = &(head)->lh_first; \
-}
-
-#define LIST_REMOVE(elm, field) { \
- if ((elm)->field.le_next != NULL) \
- (elm)->field.le_next->field.le_prev = \
- (elm)->field.le_prev; \
- *(elm)->field.le_prev = (elm)->field.le_next; \
-}
-
-/*
- * Tail queue definitions.
- */
-#define TAILQ_HEAD(name, type) \
-struct name { \
- struct type *tqh_first; /* first element */ \
- struct type **tqh_last; /* addr of last next element */ \
-}
-
-#define TAILQ_ENTRY(type) \
-struct { \
- struct type *tqe_next; /* next element */ \
- struct type **tqe_prev; /* address of previous next element */ \
-}
-
-/*
- * Tail queue functions.
- */
-#define TAILQ_INIT(head) { \
- (head)->tqh_first = NULL; \
- (head)->tqh_last = &(head)->tqh_first; \
-}
-
-#define TAILQ_INSERT_HEAD(head, elm, field) { \
- if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \
- (elm)->field.tqe_next->field.tqe_prev = \
- &(elm)->field.tqe_next; \
- else \
- (head)->tqh_last = &(elm)->field.tqe_next; \
- (head)->tqh_first = (elm); \
- (elm)->field.tqe_prev = &(head)->tqh_first; \
-}
-
-#define TAILQ_INSERT_TAIL(head, elm, field) { \
- (elm)->field.tqe_next = NULL; \
- (elm)->field.tqe_prev = (head)->tqh_last; \
- *(head)->tqh_last = (elm); \
- (head)->tqh_last = &(elm)->field.tqe_next; \
-}
-
-#define TAILQ_INSERT_AFTER(head, listelm, elm, field) { \
- if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
- (elm)->field.tqe_next->field.tqe_prev = \
- &(elm)->field.tqe_next; \
- else \
- (head)->tqh_last = &(elm)->field.tqe_next; \
- (listelm)->field.tqe_next = (elm); \
- (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \
-}
-
-#define TAILQ_REMOVE(head, elm, field) { \
- if (((elm)->field.tqe_next) != NULL) \
- (elm)->field.tqe_next->field.tqe_prev = \
- (elm)->field.tqe_prev; \
- else \
- (head)->tqh_last = (elm)->field.tqe_prev; \
- *(elm)->field.tqe_prev = (elm)->field.tqe_next; \
-}
-
-/*
- * Circular queue definitions.
- */
-#define CIRCLEQ_HEAD(name, type) \
-struct name { \
- struct type *cqh_first; /* first element */ \
- struct type *cqh_last; /* last element */ \
-}
-
-#define CIRCLEQ_ENTRY(type) \
-struct { \
- struct type *cqe_next; /* next element */ \
- struct type *cqe_prev; /* previous element */ \
-}
-
-/*
- * Circular queue functions.
- */
-#define CIRCLEQ_INIT(head) { \
- (head)->cqh_first = (void *)(head); \
- (head)->cqh_last = (void *)(head); \
-}
-
-#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) { \
- (elm)->field.cqe_next = (listelm)->field.cqe_next; \
- (elm)->field.cqe_prev = (listelm); \
- if ((listelm)->field.cqe_next == (void *)(head)) \
- (head)->cqh_last = (elm); \
- else \
- (listelm)->field.cqe_next->field.cqe_prev = (elm); \
- (listelm)->field.cqe_next = (elm); \
-}
-
-#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) { \
- (elm)->field.cqe_next = (listelm); \
- (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \
- if ((listelm)->field.cqe_prev == (void *)(head)) \
- (head)->cqh_first = (elm); \
- else \
- (listelm)->field.cqe_prev->field.cqe_next = (elm); \
- (listelm)->field.cqe_prev = (elm); \
-}
-
-#define CIRCLEQ_INSERT_HEAD(head, elm, field) { \
- (elm)->field.cqe_next = (head)->cqh_first; \
- (elm)->field.cqe_prev = (void *)(head); \
- if ((head)->cqh_last == (void *)(head)) \
- (head)->cqh_last = (elm); \
- else \
- (head)->cqh_first->field.cqe_prev = (elm); \
- (head)->cqh_first = (elm); \
-}
-
-#define CIRCLEQ_INSERT_TAIL(head, elm, field) { \
- (elm)->field.cqe_next = (void *)(head); \
- (elm)->field.cqe_prev = (head)->cqh_last; \
- if ((head)->cqh_first == (void *)(head)) \
- (head)->cqh_first = (elm); \
- else \
- (head)->cqh_last->field.cqe_next = (elm); \
- (head)->cqh_last = (elm); \
-}
-
-#define CIRCLEQ_REMOVE(head, elm, field) { \
- if ((elm)->field.cqe_next == (void *)(head)) \
- (head)->cqh_last = (elm)->field.cqe_prev; \
- else \
- (elm)->field.cqe_next->field.cqe_prev = \
- (elm)->field.cqe_prev; \
- if ((elm)->field.cqe_prev == (void *)(head)) \
- (head)->cqh_first = (elm)->field.cqe_next; \
- else \
- (elm)->field.cqe_prev->field.cqe_next = \
- (elm)->field.cqe_next; \
-}
-#endif /* !_QUEUE_H_ */
diff --git a/src/util/db2/include/db.h b/src/util/db2/include/db.h
deleted file mode 100644
index 980145a3d9..0000000000
--- a/src/util/db2/include/db.h
+++ /dev/null
@@ -1,175 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)db.h 8.8 (Berkeley) 11/2/95
- */
-
-#ifndef _DB_H_
-#define _DB_H_
-
-#include <db-config.h>
-
-#include <sys/types.h>
-
-#define RET_ERROR -1 /* Return values. */
-#define RET_SUCCESS 0
-#define RET_SPECIAL 1
-
-/* Key/data structure -- a Data-Base Thang. */
-typedef struct {
- void *data; /* data */
- size_t size; /* data length */
-} DBT;
-
-/* Routine flags. */
-#define R_CURSOR 1 /* del, put, seq */
-#define __R_UNUSED 2 /* UNUSED */
-#define R_FIRST 3 /* seq */
-#define R_IAFTER 4 /* put (RECNO) */
-#define R_IBEFORE 5 /* put (RECNO) */
-#define R_LAST 6 /* seq (BTREE, RECNO) */
-#define R_NEXT 7 /* seq */
-#define R_NOOVERWRITE 8 /* put */
-#define R_PREV 9 /* seq (BTREE, RECNO) */
-#define R_SETCURSOR 10 /* put (RECNO) */
-#define R_RECNOSYNC 11 /* sync (RECNO) */
-
-typedef enum { DB_BTREE, DB_HASH, DB_RECNO } DBTYPE;
-
-/*
- * !!!
- * The following flags are included in the dbopen(3) call as part of the
- * open(2) flags. In order to avoid conflicts with the open flags, start
- * at the top of the 16 or 32-bit number space and work our way down. If
- * the open flags were significantly expanded in the future, it could be
- * a problem. Wish I'd left another flags word in the dbopen call.
- *
- * !!!
- * None of this stuff is implemented yet. The only reason that it's here
- * is so that the access methods can skip copying the key/data pair when
- * the DB_LOCK flag isn't set.
- */
-#if SIZEOF_INT == 4
-#define DB_LOCK 0x20000000 /* Do locking. */
-#define DB_SHMEM 0x40000000 /* Use shared memory. */
-#define DB_TXN 0x80000000 /* Do transactions. */
-#else
-#define DB_LOCK 0x2000 /* Do locking. */
-#define DB_SHMEM 0x4000 /* Use shared memory. */
-#define DB_TXN 0x8000 /* Do transactions. */
-#endif
-
-/* deal with turning prototypes on and off */
-
-#ifndef __P
-#if defined(__STDC__) || defined(__cplusplus)
-#define __P(protos) protos /* full-blown ANSI C */
-#else /* !(__STDC__ || __cplusplus) */
-#define __P(protos) () /* traditional C preprocessor */
-#endif
-#endif /* no __P from system */
-
-/* Access method description structure. */
-typedef struct __db {
- DBTYPE type; /* Underlying db type. */
- int (*close) __P((struct __db *));
- int (*del) __P((const struct __db *, const DBT *, u_int));
- int (*get) __P((const struct __db *, const DBT *, DBT *, u_int));
- int (*put) __P((const struct __db *, DBT *, const DBT *, u_int));
- int (*seq) __P((const struct __db *, DBT *, DBT *, u_int));
- int (*sync) __P((const struct __db *, u_int));
- void *internal; /* Access method private. */
- int (*fd) __P((const struct __db *));
-} DB;
-
-#define BTREEMAGIC 0x053162
-#define BTREEVERSION 3
-
-/* Structure used to pass parameters to the btree routines. */
-typedef struct {
-#define R_DUP 0x01 /* duplicate keys */
- u_long flags;
- u_int cachesize; /* bytes to cache */
- int maxkeypage; /* maximum keys per page */
- int minkeypage; /* minimum keys per page */
- u_int psize; /* page size */
- int (*compare) /* comparison function */
- __P((const DBT *, const DBT *));
- size_t (*prefix) /* prefix function */
- __P((const DBT *, const DBT *));
- int lorder; /* byte order */
-} BTREEINFO;
-
-#define HASHMAGIC 0x061561
-#define HASHVERSION 3
-
-/* Structure used to pass parameters to the hashing routines. */
-typedef struct {
- u_int bsize; /* bucket size */
- u_int ffactor; /* fill factor */
- u_int nelem; /* number of elements */
- u_int cachesize; /* bytes to cache */
- u_int32_t /* hash function */
- (*hash) __P((const void *, size_t));
- int lorder; /* byte order */
-} HASHINFO;
-
-/* Structure used to pass parameters to the record routines. */
-typedef struct {
-#define R_FIXEDLEN 0x01 /* fixed-length records */
-#define R_NOKEY 0x02 /* key not required */
-#define R_SNAPSHOT 0x04 /* snapshot the input */
- u_long flags;
- u_int cachesize; /* bytes to cache */
- u_int psize; /* page size */
- int lorder; /* byte order */
- size_t reclen; /* record length (fixed-length records) */
- u_char bval; /* delimiting byte (variable-length records */
- char *bfname; /* btree file name */
-} RECNOINFO;
-
-#if defined(__cplusplus)
-#define __BEGIN_DECLS extern "C" {
-#define __END_DECLS };
-#else
-#define __BEGIN_DECLS
-#define __END_DECLS
-#endif
-
-#define dbopen kdb2_dbopen
-#define bt_rseq kdb2_bt_rseq /* XXX kludge */
-__BEGIN_DECLS
-DB *dbopen __P((const char *, int, int, DBTYPE, const void *));
-int bt_rseq(const DB*, DBT *, DBT *, void **, u_int); /* XXX kludge */
-__END_DECLS
-
-#endif /* !_DB_H_ */
diff --git a/src/util/db2/libdb.exports b/src/util/db2/libdb.exports
deleted file mode 100644
index 5dbc2e4389..0000000000
--- a/src/util/db2/libdb.exports
+++ /dev/null
@@ -1,99 +0,0 @@
-__default_hash
-__kdb2_add_bigpage
-__kdb2_add_ovflpage
-__kdb2_addel
-__kdb2_big_delete
-__kdb2_big_insert
-__kdb2_big_keydata
-__kdb2_big_return
-__kdb2_bt_close
-__kdb2_bt_cmp
-__kdb2_bt_defcmp
-__kdb2_bt_defpfx
-__kdb2_bt_deleaf
-__kdb2_bt_delete
-__kdb2_bt_fd
-__kdb2_bt_free
-__kdb2_bt_get
-__kdb2_bt_new
-__kdb2_bt_open
-__kdb2_bt_pgin
-__kdb2_bt_pgout
-__kdb2_bt_put
-__kdb2_bt_ret
-__kdb2_bt_search
-__kdb2_bt_seq
-__kdb2_bt_setcur
-__kdb2_bt_split
-__kdb2_bt_sync
-__kdb2_call_hash
-__kdb2_cursor_creat
-__kdb2_dbpanic
-__kdb2_delete_page
-__kdb2_delpair
-__kdb2_expand_table
-__kdb2_find_bigpair
-__kdb2_free_ovflpage
-__kdb2_get_bigkey
-__kdb2_get_item
-__kdb2_get_item_done
-__kdb2_get_item_first
-__kdb2_get_item_next
-__kdb2_get_item_reset
-__kdb2_get_page
-__kdb2_hash_open
-__kdb2_ibitmap
-__kdb2_log2
-__kdb2_new_page
-__kdb2_ovfl_delete
-__kdb2_ovfl_get
-__kdb2_ovfl_put
-__kdb2_pgin_routine
-__kdb2_pgout_routine
-__kdb2_put_page
-__kdb2_rec_close
-__kdb2_rec_delete
-__kdb2_rec_dleaf
-__kdb2_rec_fd
-__kdb2_rec_fmap
-__kdb2_rec_fpipe
-__kdb2_rec_get
-__kdb2_rec_iput
-__kdb2_rec_open
-__kdb2_rec_put
-__kdb2_rec_ret
-__kdb2_rec_search
-__kdb2_rec_seq
-__kdb2_rec_sync
-__kdb2_rec_vmap
-__kdb2_rec_vpipe
-__kdb2_split_page
-kdb2_bt_rseq
-kdb2_dbm_clearerr
-kdb2_dbm_close
-kdb2_dbm_delete
-kdb2_dbm_dirfno
-kdb2_dbm_error
-kdb2_dbm_fetch
-kdb2_dbm_firstkey
-kdb2_dbm_nextkey
-kdb2_dbm_open
-kdb2_dbm_store
-kdb2_dbminit
-kdb2_dbopen
-kdb2_delete
-kdb2_fetch
-kdb2_firstkey
-kdb2_hcreate
-kdb2_hdestroy
-kdb2_hsearch
-kdb2_mpool_close
-kdb2_mpool_delete
-kdb2_mpool_filter
-kdb2_mpool_get
-kdb2_mpool_new
-kdb2_mpool_open
-kdb2_mpool_put
-kdb2_mpool_sync
-kdb2_nextkey
-kdb2_store
diff --git a/src/util/db2/man/Makefile.inc b/src/util/db2/man/Makefile.inc
deleted file mode 100644
index f85cba1f81..0000000000
--- a/src/util/db2/man/Makefile.inc
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)Makefile.inc 8.2 (Berkeley) 11/14/94
-
-.PATH: ${.CURDIR}/db/man
-
-MAN3+= db_btree.0 db_hash.0 db_lock.0 db_log.0 db_mpool.0 db_open.0 \
- db_recno.0
-MLINKS+=db_open.3 db.3 db_open.3 dbopen.3
diff --git a/src/util/db2/man/db.man.ps b/src/util/db2/man/db.man.ps
deleted file mode 100644
index 23feea6e5c..0000000000
--- a/src/util/db2/man/db.man.ps
+++ /dev/null
@@ -1,2295 +0,0 @@
-%!PS-Adobe-3.0
-%%Creator: groff version 1.08
-%%DocumentNeededResources: font Times-Roman
-%%+ font Times-Bold
-%%+ font Times-Italic
-%%DocumentSuppliedResources: procset grops 1.08 0
-%%Pages: 28
-%%PageOrder: Ascend
-%%Orientation: Portrait
-%%EndComments
-%%BeginProlog
-%%BeginResource: procset grops 1.08 0
-/setpacking where{
-pop
-currentpacking
-true setpacking
-}if
-/grops 120 dict dup begin
-/SC 32 def
-/A/show load def
-/B{0 SC 3 -1 roll widthshow}bind def
-/C{0 exch ashow}bind def
-/D{0 exch 0 SC 5 2 roll awidthshow}bind def
-/E{0 rmoveto show}bind def
-/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
-/G{0 rmoveto 0 exch ashow}bind def
-/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/I{0 exch rmoveto show}bind def
-/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
-/K{0 exch rmoveto 0 exch ashow}bind def
-/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/M{rmoveto show}bind def
-/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
-/O{rmoveto 0 exch ashow}bind def
-/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/Q{moveto show}bind def
-/R{moveto 0 SC 3 -1 roll widthshow}bind def
-/S{moveto 0 exch ashow}bind def
-/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/SF{
-findfont exch
-[exch dup 0 exch 0 exch neg 0 0]makefont
-dup setfont
-[exch/setfont cvx]cvx bind def
-}bind def
-/MF{
-findfont
-[5 2 roll
-0 3 1 roll
-neg 0 0]makefont
-dup setfont
-[exch/setfont cvx]cvx bind def
-}bind def
-/level0 0 def
-/RES 0 def
-/PL 0 def
-/LS 0 def
-/PLG{
-gsave newpath clippath pathbbox grestore
-exch pop add exch pop
-}bind def
-/BP{
-/level0 save def
-1 setlinecap
-1 setlinejoin
-72 RES div dup scale
-LS{
-90 rotate
-}{
-0 PL translate
-}ifelse
-1 -1 scale
-}bind def
-/EP{
-level0 restore
-showpage
-}bind def
-/DA{
-newpath arcn stroke
-}bind def
-/SN{
-transform
-.25 sub exch .25 sub exch
-round .25 add exch round .25 add exch
-itransform
-}bind def
-/DL{
-SN
-moveto
-SN
-lineto stroke
-}bind def
-/DC{
-newpath 0 360 arc closepath
-}bind def
-/TM matrix def
-/DE{
-TM currentmatrix pop
-translate scale newpath 0 0 .5 0 360 arc closepath
-TM setmatrix
-}bind def
-/RC/rcurveto load def
-/RL/rlineto load def
-/ST/stroke load def
-/MT/moveto load def
-/CL/closepath load def
-/FL{
-currentgray exch setgray fill setgray
-}bind def
-/BL/fill load def
-/LW/setlinewidth load def
-/RE{
-findfont
-dup maxlength 1 index/FontName known not{1 add}if dict begin
-{
-1 index/FID ne{def}{pop pop}ifelse
-}forall
-/Encoding exch def
-dup/FontName exch def
-currentdict end definefont pop
-}bind def
-/DEFS 0 def
-/EBEGIN{
-moveto
-DEFS begin
-}bind def
-/EEND/end load def
-/CNT 0 def
-/level1 0 def
-/PBEGIN{
-/level1 save def
-translate
-div 3 1 roll div exch scale
-neg exch neg exch translate
-0 setgray
-0 setlinecap
-1 setlinewidth
-0 setlinejoin
-10 setmiterlimit
-[]0 setdash
-/setstrokeadjust where{
-pop
-false setstrokeadjust
-}if
-/setoverprint where{
-pop
-false setoverprint
-}if
-newpath
-/CNT countdictstack def
-userdict begin
-/showpage{}def
-}bind def
-/PEND{
-clear
-countdictstack CNT sub{end}repeat
-level1 restore
-}bind def
-end def
-/setpacking where{
-pop
-setpacking
-}if
-%%EndResource
-%%IncludeResource: font Times-Roman
-%%IncludeResource: font Times-Bold
-%%IncludeResource: font Times-Italic
-grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL
-792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron/scaron/zcaron
-/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space
-/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft
-/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four
-/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C
-/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash
-/bracketright/circumflex/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q
-/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase
-/guillemotleft/guillemotright/bullet/florin/fraction/perthousand/dagger
-/daggerdbl/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
-/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
-/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar
-/section/dieresis/copyright/ordfeminine/guilsinglleft/logicalnot/minus
-/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu
-/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guilsinglright
-/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde
-/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute
-/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
-/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls
-/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute
-/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve
-/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex
-/udieresis/yacute/thorn/ydieresis]def/Times-Italic@0 ENC0/Times-Italic RE
-/Times-Bold@0 ENC0/Times-Bold RE/Times-Roman@0 ENC0/Times-Roman RE
-%%EndProlog
-%%Page: 1 1
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 113.45(DB_BTREE\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 113.45(anual DB_BTREE\(3\))340.17 48 R/F1 9/Times-Bold@0 SF -.18(NA)
-72 84 S(ME).18 E F0(db_btree \255 btree database access method)108 96 Q F1
-(DESCRIPTION)72 112.8 Q F0 .486(The DB library is a f)108 124.8 R .485
-(amily of groups of functions that pro)-.1 F .485
-(vides a modular programming interf)-.15 F .485(ace to trans-)-.1 F .822
-(actions and record-oriented \214le access.)108 136.8 R .822
-(The library includes support for transaction, locking, logging and)5.822 F
-.258(\214le b)108 148.8 R(uf)-.2 E .258(fering functionality)-.25 F 2.758(,a)
--.65 G 2.758(sw)223.214 148.8 S .258(ell as v)237.082 148.8 R .258(arious inde)
--.25 F -.15(xe)-.15 G 2.758(da).15 G .258(ccess methods.)331.434 148.8 R(Man)
-5.258 E 2.758(yo)-.15 G 2.758(ft)427.878 148.8 S .258
-(he functional groups \(e.g.)436.746 148.8 R .528(the memory pool functions\) \
-are useful independently of the rest of the DB functions, although some func-)
-108 160.8 R .306(tional groups are e)108 172.8 R .306
-(xplicitly based on other functional groups \(e.g.)-.15 F .306
-(transactions and logging\).)5.306 F -.15(Fo)5.306 G 2.806(rag).15 G(eneral)
-515.57 172.8 Q .245(description of transactions, see)108 184.8 R/F2 10
-/Times-Italic@0 SF(db_txn)2.745 E F0 2.745(\(3\). F).24 F .245
-(or a general description of the access methods, see)-.15 F F2(db_open)2.745 E
-F0(\(3\)).24 E .308(and then the indi)108 196.8 R .308
-(vidual access method manual pages:)-.25 F F2(db_btr)2.807 E(ee)-.37 E F0
-(\(3\),).18 E F2(db_hash)2.807 E F0(\(3\),).28 E F2(db_lo)2.807 E(g)-.1 E F0
-.307(\(3\) and).22 F F2(db_r)2.807 E(ecno)-.37 E F0(\(3\).).18 E -.15(Fo)108
-208.8 S 3.635(rag).15 G 1.135(eneral description of the lock manager)138.45
-208.8 R 3.635(,s)-.4 G(ee)307.32 208.8 Q F2(db_loc)3.635 E(k)-.2 E F0 3.635
-(\(3\). F).67 F 1.135(or a general description of the memory)-.15 F
-(pool manager)108 220.8 Q 2.5(,s)-.4 G(ee)171.2 220.8 Q F2(db_mpool)2.5 E F0
-(\(3\).).51 E
-(This manual page describes speci\214c details of the btree access method.)108
-237.6 Q 1.518(The btree data structure is a sorted, balanced tree structure st\
-oring associated k)108 254.4 R -.15(ey)-.1 G 1.517(/data pairs.).15 F
-(Searches,)6.517 E .598(insertions, and deletions in the btree will all comple\
-te in O lg base N where base is the a)108 266.4 R -.15(ve)-.2 G .598
-(rage \214ll f).15 F(actor)-.1 E(.)-.55 E .306
-(Often, inserting ordered data into btrees results in a lo)108 278.4 R 2.806
-<778c>-.25 G .305(ll f)341.61 278.4 R(actor)-.1 E 5.305(.T)-.55 G .305
-(his implementation has been modi\214ed)386.56 278.4 R(to mak)108 290.4 Q 2.5
-(eo)-.1 G(rdered insertion the best case, resulting in a much better than norm\
-al page \214ll f)147.34 290.4 Q(actor)-.1 E(.)-.55 E F1 -.495(AC)72 307.2 S
-(CESS METHOD SPECIFIC INFORMA).495 E(TION)-.855 E F0 .175
-(The btree access method speci\214c data structure pro)108 319.2 R .176
-(vided to)-.15 F F2(db_open)2.676 E F0 .176(is typedef)2.676 F 1.176 -.5('d a)
-.55 H .176(nd named BTREEINFO.).5 F 2.638(AB)108 331.2 S .138
-(TREEINFO structure has at least the follo)124.528 331.2 R .137
-(wing \214elds, which may be initialized before calling)-.25 F F2(db_open)2.637
-E F0(:).24 E(u_int cachesize;)108 348 Q 3.743(As)133 360 S 1.243
-(uggested maximum size \(in bytes\) of the memory cache.)147.853 360 R 1.243
-(This v)6.243 F 1.243(alue is)-.25 F/F3 10/Times-Bold@0 SF(only)3.743 E F0
-(advisory)3.743 E 3.744(,a)-.65 G 1.244(nd the)514.036 360 R .017
-(access method will allocate more memory rather than f)133 372 R 2.517
-(ail. Since)-.1 F -2.15 -.25(ev e)2.517 H .016(ry search e).25 F .016
-(xamines the root page)-.15 F 1.319
-(of the tree, caching the most recently used pages substantially impro)133 384
-R -.15(ve)-.15 G 3.82(sa).15 G 1.32(ccess time.)441.05 384 R 1.32(In addition,)
-6.32 F(ph)133 396 Q .911(ysical writes are delayed as long as possible, so a m\
-oderate cache can reduce the number of I/O)-.05 F 1.497
-(operations signi\214cantly)133 408 R 6.497(.O)-.65 G -.15(bv)243.674 408 S
-(iously).15 E 3.997(,u)-.65 G 1.497(sing a cache increases \(b)288.821 408 R
-1.498(ut only increases\) the lik)-.2 F 1.498(elihood of)-.1 F .336(corruption\
- or lost data if the system crashes while a tree is being modi\214ed.)133 420 R
-(If)5.336 E F2(cac)2.836 E(hesize)-.15 E F0 .335(is 0 \(no size)2.835 F
-(is speci\214ed\) a def)133 432 Q(ault cache is used.)-.1 E
-(int \(*compare\)\(const DBT *, const DBT *\);)108 448.8 Q .194
-(Compare is the k)133 460.8 R .494 -.15(ey c)-.1 H .194(omparison function.).15
-F .194(It must return an inte)5.194 F .194
-(ger less than, equal to, or greater than)-.15 F .656(zero if the \214rst k)133
-472.8 R .956 -.15(ey a)-.1 H -.18(rg).15 G .656
-(ument is considered to be respecti).18 F -.15(ve)-.25 G .655
-(ly less than, equal to, or greater than the).15 F .798(second k)133 484.8 R
-1.098 -.15(ey a)-.1 H -.18(rg).15 G 3.298(ument. The).18 F .798
-(same comparison function must be used on a gi)3.298 F -.15(ve)-.25 G 3.298(nt)
-.15 G .799(ree e)462.774 484.8 R -.15(ve)-.25 G .799(ry time it is).15 F 2.79
-(opened. If)133 496.8 R F2(compar)2.79 E(e)-.37 E F0 .29
-(is NULL \(no comparison function is speci\214ed\), the k)2.79 F -.15(ey)-.1 G
-2.79(sa).15 G .29(re compared le)451.08 496.8 R(xically)-.15 E(,)-.65 E
-(with shorter k)133 508.8 Q -.15(ey)-.1 G 2.5(sc).15 G
-(onsidered less than longer k)208.57 508.8 Q -.15(ey)-.1 G(s.).15 E
-(u_long \215ags;)108 525.6 Q(The \215ag v)133 537.6 Q(alue is speci\214ed by)
--.25 E F2(or)2.5 E F0('ing an).73 E 2.5(yo)-.15 G 2.5(ft)302.2 537.6 S
-(he follo)310.81 537.6 Q(wing v)-.25 E(alues:)-.25 E(R_DUP)133 554.4 Q .354
-(Permit duplicate k)158 566.4 R -.15(ey)-.1 G 2.854(si).15 G 2.854(nt)250.752
-566.4 S .355(he tree, i.e. permit insertion if the k)261.386 566.4 R .655 -.15
-(ey t)-.1 H 2.855(ob).15 G 2.855(ei)432.64 566.4 S .355(nserted already e)
-442.715 566.4 R .355(xists in)-.15 F 1.65(the tree.)158 578.4 R 1.65(The def)
-6.65 F 1.65(ault beha)-.1 F(vior)-.2 E 4.149(,a)-.4 G 4.149(sd)295.509 578.4 S
-1.649(escribed in)308.548 578.4 R F2(db_open)4.149 E F0 1.649(\(3\), is to o)
-.24 F -.15(ve)-.15 G 1.649(rwrite a matching k).15 F -.15(ey)-.1 G .783
-(when inserting a ne)158 590.4 R 3.283(wk)-.25 G 1.083 -.15(ey o)253.542 590.4
-T 3.283(rt).15 G 3.283(of)280.508 590.4 S .783(ail if the R_NOO)292.021 590.4 R
-(VER)-.5 E .784(WRITE \215ag is speci\214ed.)-.55 F .784(The R_DUP)5.784 F .129
-(\215ag is o)158 602.4 R -.15(ve)-.15 G .129(rridden by the R_NOO).15 F(VER)-.5
-E .128(WRITE \215ag, and if the R_NOO)-.55 F(VER)-.5 E .128
-(WRITE \215ag is spec-)-.55 F(i\214ed, attempts to insert duplicate k)158 614.4
-Q -.15(ey)-.1 G 2.5(si).15 G(nto the tree will f)314.69 614.4 Q(ail.)-.1 E .835
-(If the database contains duplicate k)158 631.2 R -.15(ey)-.1 G .835
-(s, the order of retrie).15 F -.25(va)-.25 G 3.335(lo).25 G 3.336(fk)414.7
-631.2 S -.15(ey)426.266 631.2 S .836(/data pairs is unde\214ned if).15 F(the)
-158 643.2 Q F2 -.1(ge)3.003 G(t).1 E F0 .503(function is used, ho)3.003 F(we)
--.25 E -.15(ve)-.25 G -.4(r,).15 G F2(seq)3.403 E F0 .502
-(function calls with the R_CURSOR \215ag set will al)3.003 F -.1(wa)-.1 G(ys).1
-E(return the logical `)158 655.2 Q(`\214rst')-.74 E 2.5('o)-.74 G 2.5(fa)263.72
-655.2 S .3 -.15(ny g)273.99 655.2 T(roup of duplicate k).15 E -.15(ey)-.1 G(s.)
-.15 E(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q 99.315
-(ution August)-.2 F(1, 1995)2.5 E(1)535 732 Q EP
-%%Page: 2 2
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 113.45(DB_BTREE\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 113.45(anual DB_BTREE\(3\))340.17 48 R(int lorder;)108 84 Q .65
-(The byte order for inte)133 96 R .65(gers in the stored database metadata.)
--.15 F .65(The number should represent the order)5.65 F .749(as an inte)133 108
-R .749(ger; for e)-.15 F .749(xample, big endian order w)-.15 F .749
-(ould be the number 4,321.)-.1 F(If)5.749 E/F1 10/Times-Italic@0 SF(lor)3.249 E
-(der)-.37 E F0 .749(is 0 \(no order is)3.249 F
-(speci\214ed\) the current host order is used.)133 120 Q(int maxk)108 136.8 Q
--.15(ey)-.1 G(page;).15 E .073(The maximum number of k)133 148.8 R -.15(ey)-.1
-G 2.573(sw).15 G .073(hich will be stored on an)266.155 148.8 R 2.574(ys)-.15 G
-.074(ingle page.)376.436 148.8 R .074(This functionality is not cur)5.074 F(-)
--.2 E(rently implemented.)133 160.8 Q(int mink)108 177.6 Q -.15(ey)-.1 G(page;)
-.15 E .532(The minimum number of k)133 189.6 R -.15(ey)-.1 G 3.031(sw).15 G
-.531(hich will be stored on an)266.787 189.6 R 3.031(ys)-.15 G .531
-(ingle page.)379.813 189.6 R .531(This v)5.531 F .531(alue is used to deter)
--.25 F(-)-.2 E .558(mine which k)133 201.6 R -.15(ey)-.1 G 3.058(sw).15 G .558
-(ill be stored on o)211.914 201.6 R -.15(ve)-.15 G(r\215o).15 E 3.058(wp)-.25 G
-.558(ages, i.e. if a k)319.424 201.6 R .859 -.15(ey o)-.1 H 3.059(rd).15 G .559
-(ata item is longer than the page-)408.336 201.6 R .063(size di)133 213.6 R
-.063(vided by the mink)-.25 F -.15(ey)-.1 G .063(page v).15 F .063
-(alue, it will be stored on o)-.25 F -.15(ve)-.15 G(r\215o).15 E 2.563(wp)-.25
-G .062(ages instead of in the page itself.)408.816 213.6 R(If)133 225.6 Q F1
-(mink)2.5 E -.3(ey)-.1 G(pa).3 E -.1(ge)-.1 G F0(is 0 \(no minimum number of k)
-2.6 E -.15(ey)-.1 G 2.5(si).15 G 2.5(ss)332.96 225.6 S(peci\214ed\) a v)343.24
-225.6 Q(alue of 2 is used.)-.25 E
-(size_t \(*pre\214x\)\(const DBT *, const DBT *\);)108 242.4 Q .691
-(Pre\214x is the pre\214x comparison function.)133 254.4 R .692
-(If speci\214ed, this function must return the number of bytes)5.691 F .195
-(of the second k)133 266.4 R .495 -.15(ey a)-.1 H -.18(rg).15 G .195
-(ument which are necessary to determine that it is greater than the \214rst k)
-.18 F .495 -.15(ey a)-.1 H -.18(rg).15 G(u-).18 E 2.994(ment. If)133 278.4 R
-.494(the k)2.994 F -.15(ey)-.1 G 2.994(sa).15 G .494(re equal, the k)211.376
-278.4 R .794 -.15(ey l)-.1 H .494(ength should be returned.).15 F .494
-(Note, the usefulness of this function)5.494 F .327(is v)133 290.4 R .327
-(ery data dependent, b)-.15 F .326(ut, in some data sets can produce signi\214\
-cantly reduced tree sizes and search)-.2 F 2.789(times. If)133 302.4 R F1(pr)
-2.789 E(e\214x)-.37 E F0 .289(is NULL \(no pre\214x function is speci\214ed\),)
-2.789 F/F2 10/Times-Bold@0 SF(and)2.789 E F0 .29
-(no comparison function is speci\214ed, a)2.79 F(def)133 314.4 Q .902(ault le)
--.1 F .902(xical comparison function is used.)-.15 F(If)5.901 E F1(pr)3.401 E
-(e\214x)-.37 E F0 .901(is NULL and a comparison function is speci-)3.401 F
-(\214ed, no pre\214x comparison is done.)133 326.4 Q(u_int psize;)108 343.2 Q
--.15(Pa)133 355.2 S .118
-(ge size is the size \(in bytes\) of the pages used for nodes in the tree.).15
-F .119(The minimum page size is 512)5.119 F .377
-(bytes and the maximum page size is 64K.)133 367.2 R(If)5.376 E F1(psize)2.876
-E F0 .376(is 0 \(no page size is speci\214ed\) a page size is cho-)2.876 F
-(sen based on the underlying \214le system I/O block size.)133 379.2 Q .79
-(If the \214le already e)108 396 R .79(xists \(and the O_TR)-.15 F .79
-(UNC \215ag is not speci\214ed\), the v)-.4 F .79
-(alues speci\214ed for the parameters)-.25 F
-(\215ags, lorder and psize are ignored in f)108 408 Q -.2(avo)-.1 G 2.5(ro).2 G
-2.5(ft)284.4 408 S(he v)293.01 408 Q(alues used when the tree w)-.25 E
-(as created.)-.1 E/F3 9/Times-Bold@0 SF(DB OPERA)72 424.8 Q(TIONS)-.855 E F0
-1.037(The functions returned by)108 436.8 R F1(db_open)3.537 E F0 1.036
-(for the btree access method are as described in)3.536 F F1(db_open)3.536 E F0
-1.036(\(3\), with the).24 F(follo)108 448.8 Q(wing e)-.25 E
-(xceptions and additions:)-.15 E 5.28(type The)108 465.6 R(type is DB_BTREE.)
-2.5 E 10.28(del Space)108 482.4 R 1.681(freed up by deleting k)4.181 F -.15(ey)
--.1 G 1.681(/data pairs from the tree is ne).15 F -.15(ve)-.25 G 4.181(rr).15 G
-1.682(eclaimed, although it is reused)411.342 482.4 R .734(where possible.)133
-494.4 R .734(This means that the btree storage structure is gro)5.734 F(w-only)
--.25 E 5.734(.T)-.65 G .734(he only solutions are to)443.734 494.4 R -.2(avo)
-133 506.4 S(id e).2 E(xcessi)-.15 E .3 -.15(ve d)-.25 H
-(eletions, or to create a fresh tree periodically from a scan of an e).15 E
-(xisting one.)-.15 E 9.72(put The)108 523.2 R F1(put)2.5 E F0(function tak)2.5
-E(es the follo)-.1 E(wing additional \215ags:)-.25 E(R_SETCURSOR)133 540 Q
-(Store the k)158 552 Q -.15(ey)-.1 G(/data pair).15 E 2.5(,s)-.4 G
-(etting or initializing the position of the cursor to reference it.)256.5 552 Q
-9.17(seq F)108 568.8 R(orw)-.15 E
-(ard sequential scans of a tree are from the least k)-.1 E .3 -.15(ey t)-.1 H
-2.5(ot).15 G(he greatest.)373.55 568.8 Q .892(The returned k)133 585.6 R 1.192
--.15(ey f)-.1 H .892(or the).15 F F1(seq)3.393 E F0 .893
-(function is not necessarily an e)3.393 F .893
-(xact match for the speci\214ed k)-.15 F 1.193 -.15(ey i)-.1 H 3.393(nt).15 G
-(he)530.56 585.6 Q .5(btree access method.)133 597.6 R .5(The returned k)5.5 F
-.8 -.15(ey i)-.1 H 3(st).15 G .499(he smallest k)307.04 597.6 R .799 -.15(ey g)
--.1 H .499(reater than or equal to the speci\214ed k).15 F -.15(ey)-.1 G(,)-.5
-E(permitting partial k)133 609.6 Q .3 -.15(ey m)-.1 H
-(atches and range searches.).15 E(The)133 626.4 Q F1(seq)2.5 E F0(function tak)
-2.5 E(es the follo)-.1 E(wing additional \215ags:)-.25 E(R_LAST)133 643.2 Q .04
-(The last k)158 655.2 R -.15(ey)-.1 G .04(/data pair of the database is return\
-ed, and the cursor is set or initialized to reference).15 F(it.)158 667.2 Q
-(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q 99.315
-(ution August)-.2 F(1, 1995)2.5 E(2)535 732 Q EP
-%%Page: 3 3
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 113.45(DB_BTREE\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 113.45(anual DB_BTREE\(3\))340.17 48 R(R_PREV)133 84 Q(Retrie)158 96
-Q .59 -.15(ve t)-.25 H .29(he k).15 F -.15(ey)-.1 G .29
-(/data pair immediately before the cursor).15 F 5.29(.I)-.55 G 2.79(ft)395.73
-96 S .29(he cursor is not yet set, this is the)404.63 96 R
-(same as the R_LAST \215ag.)158 108 Q/F1 9/Times-Bold@0 SF(ERR)72 124.8 Q(ORS)
--.27 E F0(The)108 136.8 Q/F2 10/Times-Italic@0 SF(btr)2.541 E(ee)-.37 E F0 .041
-(access method functions may f)2.541 F .041(ail and set)-.1 F F2(errno)2.541 E
-F0 .041(for an)2.541 F 2.541(yo)-.15 G 2.541(ft)376.152 136.8 S .041
-(he errors speci\214ed for the library func-)384.803 136.8 R(tion)108 148.8 Q
-F2(db_open)2.5 E F0(\(3\).).24 E F1(SEE ALSO)72 165.6 Q F2(db_hash)108 177.6 Q
-F0(\(3\),).28 E F2(db_loc)2.5 E(k)-.2 E F0(\(3\),).67 E F2(db_lo)2.5 E(g)-.1 E
-F0(\(3\),).22 E F2(db_mpool)2.5 E F0(\(3\),).51 E F2(db_open)2.5 E F0(\(3\),)
-.24 E F2(db_r)2.5 E(ecno)-.37 E F0(\(3\),).18 E F2(db_txn)2.5 E F0(\(3\)).24 E
-F2(The Ubiquitous B-tr)108 201.6 Q(ee)-.37 E F0 2.5(,D).18 G(ouglas Comer)
-209.47 201.6 Q 2.5(,A)-.4 G(CM Comput. Surv)276.72 201.6 Q 2.5(.1)-.65 G
-(1, 2 \(June 1979\), 121-138.)360.25 201.6 Q F2(Pr)108 225.6 Q 1.588
-(e\214x B-tr)-.37 F(ees)-.37 E F0 4.088(,B).27 G 1.587(ayer and Unterauer)
-177.636 225.6 R 4.087(,A)-.4 G 1.587(CM T)270.447 225.6 R 1.587
-(ransactions on Database Systems, V)-.35 F 1.587(ol. 2, 1 \(March 1977\),)-1.29
-F(11-26.)108 237.6 Q F2(The Art of Computer Pr)108 261.6 Q -.1(og)-.45 G -.15
-(ra).1 G(mming V).15 E(ol. 3: Sorting and Sear)-1.11 E -.15(ch)-.37 G(ing).15 E
-F0 2.5(,D).22 G(.E. Knuth, 1968, pp 471-480.)382 261.6 Q(4.4 Berk)72 732 Q(ele)
--.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q 99.315(ution August)-.2 F(1, 1995)2.5 E
-(3)535 732 Q EP
-%%Page: 1 4
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 117.9(DB_HASH\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 117.9(anual DB_HASH\(3\))340.17 48 R/F1 9/Times-Bold@0 SF -.18(NA)72
-84 S(ME).18 E F0(db_hash \255 hash database access method)108 96 Q F1
-(DESCRIPTION)72 112.8 Q F0 .485(The DB library is a f)108 124.8 R .485
-(amily of groups of functions that pro)-.1 F .486
-(vides a modular programming interf)-.15 F .486(ace to trans-)-.1 F .823
-(actions and record-oriented \214le access.)108 136.8 R .822
-(The library includes support for transaction, locking, logging and)5.822 F
-.258(\214le b)108 148.8 R(uf)-.2 E .258(fering functionality)-.25 F 2.758(,a)
--.65 G 2.758(sw)223.214 148.8 S .258(ell as v)237.082 148.8 R .258(arious inde)
--.25 F -.15(xe)-.15 G 2.758(da).15 G .258(ccess methods.)331.434 148.8 R(Man)
-5.258 E 2.758(yo)-.15 G 2.758(ft)427.878 148.8 S .258
-(he functional groups \(e.g.)436.746 148.8 R .528(the memory pool functions\) \
-are useful independently of the rest of the DB functions, although some func-)
-108 160.8 R .306(tional groups are e)108 172.8 R .306
-(xplicitly based on other functional groups \(e.g.)-.15 F .306
-(transactions and logging\).)5.306 F -.15(Fo)5.306 G 2.806(rag).15 G(eneral)
-515.57 172.8 Q .245(description of transactions, see)108 184.8 R/F2 10
-/Times-Italic@0 SF(db_txn)2.745 E F0 2.745(\(3\). F).24 F .245
-(or a general description of the access methods, see)-.15 F F2(db_open)2.745 E
-F0(\(3\)).24 E .307(and then the indi)108 196.8 R .307
-(vidual access method manual pages:)-.25 F F2(db_btr)2.808 E(ee)-.37 E F0
-(\(3\),).18 E F2(db_hash)2.808 E F0(\(3\),).28 E F2(db_lo)2.808 E(g)-.1 E F0
-.308(\(3\) and).22 F F2(db_r)2.808 E(ecno)-.37 E F0(\(3\).).18 E -.15(Fo)108
-208.8 S 3.635(rag).15 G 1.135(eneral description of the lock manager)138.45
-208.8 R 3.635(,s)-.4 G(ee)307.32 208.8 Q F2(db_loc)3.635 E(k)-.2 E F0 3.635
-(\(3\). F).67 F 1.135(or a general description of the memory)-.15 F
-(pool manager)108 220.8 Q 2.5(,s)-.4 G(ee)171.2 220.8 Q F2(db_mpool)2.5 E F0
-(\(3\).).51 E
-(This manual page describes speci\214c details of the hashing access method.)
-108 237.6 Q .59(The hash data structure is an e)108 254.4 R .591
-(xtensible, dynamic hashing scheme.)-.15 F(Backw)5.591 E .591
-(ard compatible interf)-.1 F .591(aces to the)-.1 F .209
-(functions described in)108 266.4 R F2(dbm)2.709 E F0 .209(\(3\), and).32 F F2
-(ndbm)2.709 E F0 .209(\(3\) are pro).32 F .209(vided, ho)-.15 F(we)-.25 E -.15
-(ve)-.25 G 2.708(rt).15 G .208(hese interf)382.71 266.4 R .208
-(aces are not compatible with)-.1 F(pre)108 278.4 Q(vious \214le formats.)-.25
-E F1 -.495(AC)72 295.2 S(CESS METHOD SPECIFIC INFORMA).495 E(TION)-.855 E F0
-.612(The hash access method speci\214c data structure pro)108 307.2 R .612
-(vided to)-.15 F F2(db_open)3.112 E F0 .612(is typedef)3.112 F 1.612 -.5('d a)
-.55 H .613(nd named HASHINFO.).5 F 2.5(AH)108 319.2 S
-(ASHINFO structure has at least the follo)124.94 319.2 Q
-(wing \214elds, which may be initialized before calling)-.25 E F2(db_open)2.5 E
-F0(:).24 E(u_int bsize;)108 336 Q F2(Bsize)133 348 Q F0 2.041
-(de\214nes the hash table b)4.541 F(uck)-.2 E 2.041(et size, and is, by def)-.1
-F 2.04(ault, 256 bytes.)-.1 F 2.04(It may be preferable to)7.04 F
-(increase the page size for disk-resident tables and tables with lar)133 360 Q
-(ge data items.)-.18 E(u_int cachesize;)108 376.8 Q 3.846(As)133 388.8 S 1.347
-(uggested maximum size, in bytes, of the memory cache.)147.956 388.8 R 1.347
-(This v)6.347 F 1.347(alue is)-.25 F/F3 10/Times-Bold@0 SF(only)3.847 E F0
-(advisory)3.847 E 3.847(,a)-.65 G 1.347(nd the)513.933 388.8 R
-(access method will allocate more memory rather than f)133 400.8 Q(ail.)-.1 E
-(u_int f)108 417.6 Q -.1(fa)-.25 G(ctor;).1 E F2(Ffactor)133 429.6 Q F0 1.17
-(indicates a desired density within the hash table.)3.67 F 1.169
-(It is an approximation of the number of)6.169 F -.1(ke)133 441.6 S 1.162
-(ys allo)-.05 F 1.162(wed to accumulate in an)-.25 F 3.662(yo)-.15 G 1.162
-(ne b)284.852 441.6 R(uck)-.2 E 1.162(et, determining when the hash table gro)
--.1 F 1.162(ws or shrinks.)-.25 F(The def)133 453.6 Q(ault v)-.1 E(alue is 8.)
--.25 E(u_int32_t \(*hash\)\(const v)108 470.4 Q(oid *, size_t\);)-.2 E F2(Hash)
-133 482.4 Q F0 .788(is a user de\214ned hash function.)3.288 F .787
-(Since no hash function performs equally well on all possible)5.788 F .017
-(data, the user may \214nd that the b)133 494.4 R .018
-(uilt-in hash function does poorly on a particular data set.)-.2 F .018
-(User speci-)5.018 F 1.154(\214ed hash functions must tak)133 506.4 R 3.654(et)
--.1 G 1.354 -.1(wo a)260.61 506.4 T -.18(rg).1 G 1.154
-(uments \(a pointer to a byte string and a length\) and return a).18 F
-(32-bit quantity to be used as the hash v)133 518.4 Q(alue.)-.25 E .665
-(If a hash function is speci\214ed,)133 535.2 R F2(hash_open)3.165 E F0 .666
-(will attempt to determine if the hash function speci\214ed is)3.166 F
-(the same as the one with which the database w)133 547.2 Q
-(as created, and will f)-.1 E(ail if it is not.)-.1 E(int lorder;)108 564 Q .65
-(The byte order for inte)133 576 R .65(gers in the stored database metadata.)
--.15 F .65(The number should represent the order)5.65 F .748(as an inte)133 588
-R .749(ger; for e)-.15 F .749(xample, big endian order w)-.15 F .749
-(ould be the number 4,321.)-.1 F(If)5.749 E F2(lor)3.249 E(der)-.37 E F0 .749
-(is 0 \(no order is)3.249 F .456(speci\214ed\) the current host order is used.)
-133 600 R .456(If the)5.456 F .456(\214le already e)5.456 F .456
-(xists, the speci\214ed v)-.15 F .455(alue is ignored and)-.25 F(the v)133 612
-Q(alue speci\214ed when the tree w)-.25 E(as created is used.)-.1 E
-(u_int nelem;)108 628.8 Q F2(Nelem)133 640.8 Q F0 1.225
-(is an estimate of the \214nal size of the hash table.)3.724 F 1.225
-(If not set or set too lo)6.225 F 2.525 -.65(w, h)-.25 H 1.225(ash tables will)
-.65 F -.15(ex)133 652.8 S 1.294(pand gracefully as k).15 F -.15(ey)-.1 G 3.794
-(sa).15 G 1.294(re entered, although a slight performance de)248.296 652.8 R
-1.293(gradation may be noticed.)-.15 F(The def)133 664.8 Q(ault v)-.1 E
-(alue is 1.)-.25 E .79(If the \214le already e)108 681.6 R .79
-(xists \(and the O_TR)-.15 F .79(UNC \215ag is not speci\214ed\), the v)-.4 F
-.79(alues speci\214ed for the parameters)-.25 F(bsize, f)108 693.6 Q -.1(fa)
--.25 G(ctor).1 E 2.5(,l)-.4 G(order and nelem are ignored and the v)167.23
-693.6 Q(alues speci\214ed when the tree w)-.25 E(as created are used.)-.1 E
-(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q 99.315
-(ution August)-.2 F(1, 1995)2.5 E(1)535 732 Q EP
-%%Page: 2 5
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 117.9(DB_HASH\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 117.9(anual DB_HASH\(3\))340.17 48 R/F1 9/Times-Bold@0 SF(DB OPERA)
-72 84 Q(TIONS)-.855 E F0(The functions returned by)108 96 Q/F2 10
-/Times-Italic@0 SF(db_open)2.5 E F0
-(for the hash access method are as described in)2.5 E F2(db_open)2.5 E F0
-(\(3\).).24 E F1(ERR)72 112.8 Q(ORS)-.27 E F0(The)108 124.8 Q F2(hash)2.609 E
-F0 .109(access method functions may f)2.609 F .109(ail and set)-.1 F F2(errno)
-2.609 E F0 .109(for an)2.609 F 2.609(yo)-.15 G 2.609(ft)375.678 124.8 S .109
-(he errors speci\214ed for the library func-)384.397 124.8 R(tion)108 136.8 Q
-F2(db_open)2.5 E F0(\(3\).).24 E F1(SEE ALSO)72 153.6 Q F2(db_btr)108 165.6 Q
-(ee)-.37 E F0(\(3\),).18 E F2(db_loc)2.5 E(k)-.2 E F0(\(3\),).67 E F2(db_lo)2.5
-E(g)-.1 E F0(\(3\),).22 E F2(db_mpool)2.5 E F0(\(3\),).51 E F2(db_open)2.5 E F0
-(\(3\),).24 E F2(db_r)2.5 E(ecno)-.37 E F0(\(3\),).18 E F2(db_txn)2.5 E F0
-(\(3\)).24 E F2(Dynamic Hash T)108 189.6 Q(ables)-.92 E F0 2.5(,P).27 G(er)
-206.79 189.6 Q(-Ak)-.2 E 2.5(eL)-.1 G(arson, Communications of the A)242.86
-189.6 Q(CM, April 1988.)-.4 E F2 2.5(AN)108 213.6 S .3 -.15(ew H)123.28 213.6 T
-(ash P).15 E(ac)-.8 E(ka)-.2 E .2 -.1(ge f)-.1 H(or UNIX).1 E F0 2.5(,M).94 G
-(ar)248.41 213.6 Q(go Seltzer)-.18 E 2.5(,U)-.4 G(SENIX Proceedings, W)308.09
-213.6 Q(inter 1991.)-.4 E(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)
-132.57 732 Q 99.315(ution August)-.2 F(1, 1995)2.5 E(2)535 732 Q EP
-%%Page: 1 6
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 117.9(DB_LOCK\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 117.9(anual DB_LOCK\(3\))340.17 48 R/F1 9/Times-Bold@0 SF -.18(NA)72
-84 S(ME).18 E F0(db_lock \255 general purpose lock manager)108 96 Q F1
-(SYNOPSIS)72 112.8 Q/F2 10/Times-Bold@0 SF(#include <db_lock.h>)108 124.8 Q
-(int)108 148.8 Q(lock_cr)108 160.8 Q(eate\(const char *path, mode_t mode,)-.18
-E(int lock_modes, const int8_t con\215icts[][], u_int maxlocks\);)158 172.8 Q
-(LOCK_T)108 196.8 Q(ABLE_T *)-.9 E(lock_open\(const char *path\);)108 208.8 Q
-(int)108 232.8 Q(lock_v)108 244.8 Q(ec\(LOCK_T)-.1 E(ABLE_T *lt, DBT *lock)-.9
-E(er)-.1 E 2.5(,s)-.92 G(truct timespec *timeout,)308.21 244.8 Q
-(LOCK_REQ_T list[], int nlist, LOCK_REQ_T **elistp, DBT *con\215ict\);)158
-256.8 Q(int)108 280.8 Q(lock_get\(LOCK_T)108 292.8 Q
-(ABLE_T *lt, const DBT *lock)-.9 E(er)-.1 E(,)-.92 E
-(const DBT *obj, const lock_mode_t lock_mode, LOCK_T **lockp\);)158 304.8 Q
-(int)108 328.8 Q(lock_put\(LOCK_T *lockp\);)108 340.8 Q(int)108 364.8 Q
-(lock_close\(LOCK_T)108 376.8 Q(ABLE_T *lt\);)-.9 E(int)108 400.8 Q
-(lock_unlink\(const char *path, int f)108 412.8 Q(or)-.25 E(ce\);)-.18 E F1
-(DESCRIPTION)72 429.6 Q F0 .485(The DB library is a f)108 441.6 R .485
-(amily of groups of functions that pro)-.1 F .486
-(vides a modular programming interf)-.15 F .486(ace to trans-)-.1 F .823
-(actions and record-oriented \214le access.)108 453.6 R .822
-(The library includes support for transaction, locking, logging and)5.822 F
-.258(\214le b)108 465.6 R(uf)-.2 E .258(fering functionality)-.25 F 2.758(,a)
--.65 G 2.758(sw)223.214 465.6 S .258(ell as v)237.082 465.6 R .258(arious inde)
--.25 F -.15(xe)-.15 G 2.758(da).15 G .258(ccess methods.)331.434 465.6 R(Man)
-5.258 E 2.758(yo)-.15 G 2.758(ft)427.878 465.6 S .258
-(he functional groups \(e.g.)436.746 465.6 R .528(the memory pool functions\) \
-are useful independently of the rest of the DB functions, although some func-)
-108 477.6 R .306(tional groups are e)108 489.6 R .306
-(xplicitly based on other functional groups \(e.g.)-.15 F .306
-(transactions and logging\).)5.306 F -.15(Fo)5.306 G 2.806(rag).15 G(eneral)
-515.57 489.6 Q .245(description of transactions, see)108 501.6 R/F3 10
-/Times-Italic@0 SF(db_txn)2.745 E F0 2.745(\(3\). F).24 F .245
-(or a general description of the access methods, see)-.15 F F3(db_open)2.745 E
-F0(\(3\)).24 E .307(and then the indi)108 513.6 R .307
-(vidual access method manual pages:)-.25 F F3(db_btr)2.808 E(ee)-.37 E F0
-(\(3\),).18 E F3(db_hash)2.808 E F0(\(3\),).28 E F3(db_lo)2.808 E(g)-.1 E F0
-.308(\(3\) and).22 F F3(db_r)2.808 E(ecno)-.37 E F0(\(3\).).18 E -.15(Fo)108
-525.6 S 3.635(rag).15 G 1.135(eneral description of the lock manager)138.45
-525.6 R 3.635(,s)-.4 G(ee)307.32 525.6 Q F3(db_loc)3.635 E(k)-.2 E F0 3.635
-(\(3\). F).67 F 1.135(or a general description of the memory)-.15 F
-(pool manager)108 537.6 Q 2.5(,s)-.4 G(ee)171.2 537.6 Q F3(db_mpool)2.5 E F0
-(\(3\).).51 E
-(This manual page describes speci\214c details of the locking interf)108 554.4
-Q(ace.)-.1 E F3(Db_loc)108 571.2 Q(k)-.2 E F0 .346(is the library interf)2.846
-F .346(ace intended to pro)-.1 F .346(vide general-purpose locking.)-.15 F .347
-(While designed to w)5.347 F .347(ork with)-.1 F .946(the other DB functions, \
-these functions are also useful for more general locking purposes.)108 583.2 R
-.946(Locks can be)5.946 F(shared between processes.)108 595.2 Q .682
-(The function)108 612 R F3(loc)3.182 E(k_cr)-.2 E(eate)-.37 E F0 .683
-(creates and initializes the lock table identi\214ed by the)3.182 F F3(path)
-3.183 E F0(directory)3.183 E 5.683(.T)-.65 G .683(his direc-)501.827 612 R .565
-(tory must already e)108 624 R .565(xist when)-.15 F F3(loc)3.065 E(k_cr)-.2 E
-(eate)-.37 E F0 .565(is called.)3.065 F .565(If the lock table identi\214ed by)
-5.565 F F3(path)3.064 E F0 .564(already e)3.064 F .564(xists, then)-.15 F F3
-(loc)108 636 Q(k_cr)-.2 E(eate)-.37 E F0 .974
-(returns success without further action.)3.474 F .974
-(The \214les associated with the lock table are created in)5.974 F 2.017
-(the directory speci\214ed by)108 648 R F3(path)4.517 E F0 7.017(.\().28 G
-2.017(The group of the created \214les is based on the system and directory)
-250.846 648 R(def)108 660 Q .076(aults, and is not further speci\214ed by)-.1 F
-F3(loc)2.576 E(k_cr)-.2 E(eate)-.37 E F0 2.576(.\) All).18 F .076
-(\214les created by)2.576 F F3(loc)2.576 E(k_cr)-.2 E(eate)-.37 E F0 .077
-(are created with mode)2.577 F F3(mode)108 672 Q F0(\(as described in)2.5 E F3
--.15(ch)2.5 G(mod).15 E F0(\(2\)\) and modi\214ed by the process' umask v).77 E
-(alue \(see)-.25 E F3(umask)2.5 E F0(\(2\)\).).67 E .739(The parameter)108
-688.8 R F3(loc)3.239 E(k_modes)-.2 E F0 .739(is the number of lock modes to be\
- recognized by the lock table \(including the)3.239 F(4.4 Berk)72 732 Q(ele)-.1
-E 2.5(yD)-.15 G(istrib)132.57 732 Q 99.315(ution August)-.2 F(1, 1995)2.5 E(1)
-535 732 Q EP
-%%Page: 2 7
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 117.9(DB_LOCK\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 117.9(anual DB_LOCK\(3\))340.17 48 R -.74(``)108 84 S(not-granted')
-.74 E 2.5('m)-.74 G 2.5(ode\). The)176.22 84 R(parameter)2.5 E/F1 10
-/Times-Italic@0 SF(con\215icts)2.5 E F0(is an)2.5 E F1(loc)2.5 E(k_modes)-.2 E
-F0(by)2.5 E F1(loc)2.5 E(k_modes)-.2 E F0(array)2.5 E 5(.A)-.65 G(non-0 v)
-467.59 84 Q(alue for:)-.25 E(con\215icts[requested_mode][held_mode])158 108 Q
-.174(indicates that)108 132 R F1 -.37(re)2.674 G(quested_mode).37 E F0(and)
-2.674 E F1(held_mode)2.674 E F0 2.675(con\215ict. The)2.674 F -.74(``)2.675 G
-(not-granted').74 E 2.675('m)-.74 G .175(ode must be represented by 0.)419.705
-132 R(The include \214le <db_lock.h> declares tw)108 148.8 Q 2.5(oc)-.1 G
-(ommonly used con\215ict arrays:)283.87 148.8 Q(int lock_sx_n;)108 165.6 Q
-(const int8_t lock_sx_c[lock_sx_n][lock_sx_n];)108 177.6 Q(These v)133 189.6 Q
-(ariables specify a con\215ict array for a simple scheme using shared and e)
--.25 E(xclusi)-.15 E .3 -.15(ve l)-.25 H(ock modes.).15 E(int lock_g_n;)108
-206.4 Q(const int8_t lock_g_c[lock_g_n][lock_g_n];)108 218.4 Q 1.071(These v)
-133 230.4 R 1.071(ariables specify a con\215ict array that in)-.25 F -.2(vo)-.4
-G(lv).2 E 1.071(es v)-.15 F 1.07
-(arious intent lock modes \(e.g. intent shared\))-.25 F
-(that are used for multigranularity locking.)133 242.4 Q 1.53
-(In addition, <db_lock.h> de\214nes the follo)108 259.2 R 1.531
-(wing macros that name lock modes for use with the standard)-.25 F(tables abo)
-108 271.2 Q -.15(ve)-.15 G(:).15 E(LOCK_IS)144 288 Q(intent shared)169 300 Q
-(LOCK_IX)144 312 Q(intent e)169 324 Q(xclusi)-.15 E -.15(ve)-.25 G(LOCK_NG)144
-336 Q(not granted \(al)169 348 Q -.1(wa)-.1 G(ys 0\)).1 E(LOCK_S)144 360 Q
-(shared)169 372 Q(LOCK_SIX)144 384 Q(shared/intent e)169 396 Q(xclusi)-.15 E
--.15(ve)-.25 G(LOCK_X)144 408 Q -.15(ex)169 420 S(clusi).15 E -.15(ve)-.25 G F1
-(Maxloc)108 436.8 Q(ks)-.2 E F0 .442(is the maximum number of locks to be held\
- or requested in the table, and is used by)2.942 F F1(loc)2.941 E(k_cr)-.2 E
-(eate)-.37 E F0(to estimate ho)108 448.8 Q 2.5(wm)-.25 G
-(uch space to allocate for v)181.36 448.8 Q(arious lock-table data structures.)
--.25 E(The function)108 465.6 Q F1(loc)2.5 E(k_cr)-.2 E(eate)-.37 E F0
-(returns -1 on f)2.5 E(ailure, setting)-.1 E F1(errno)2.5 E F0 2.5(,a).18 G
-(nd 0 on success.)356.07 465.6 Q .202(The function)108 482.4 R F1(loc)2.703 E
-(k_open)-.2 E F0 .203(returns a pointer to the lock table identi\214ed by)2.703
-F F1(path)2.703 E F0 2.703(,w).28 G .203(hich must ha)425.678 482.4 R .503 -.15
-(ve a)-.2 H .203(lready been).15 F 1.162(created by a call to)108 494.4 R F1
-(loc)3.661 E(k_cr)-.2 E(eate)-.37 E F0 6.161(.T).18 G 1.161(he process must ha)
-252.869 494.4 R 1.461 -.15(ve p)-.2 H 1.161
-(ermission to read and write \214les with o).15 F(wners,)-.25 E .06
-(groups and permissions as described for)108 506.4 R F1(loc)2.56 E(k_cr)-.2 E
-(eate)-.37 E F0 5.06(.T).18 G(he)331.04 506.4 Q F1(loc)2.56 E(k_open)-.2 E F0
-.06(function returns NULL on f)2.56 F .06(ailure, set-)-.1 F(ting)108 518.4 Q
-F1(errno)2.5 E F0(.).18 E .986(The function)108 535.2 R F1(loc)3.486 E(k_vec)
--.2 E F0 .986
-(atomically obtains and releases one or more locks from the designated table.)
-3.486 F(The)5.986 E(function)108 547.2 Q F1(loc)4.52 E(k_vec)-.2 E F0 2.02(is \
-intended to support acquisition or trading of multiple locks under one lock ta\
-ble)4.52 F(semaphore, as is needed for lock coupling or in multigranularity lo\
-cking for lock escalation.)108 559.2 Q .746(If an)108 576 R 3.246(yo)-.15 G
-3.246(ft)140.442 576 S .746(he requested locks cannot be acquired or an)149.798
-576 R 3.246(yo)-.15 G 3.246(ft)342.786 576 S .746
-(he locks to be released cannot be released, no)352.142 576 R .117
-(locks are acquired and no locks are released, and)108 588 R F1(loc)2.617 E
-(k_vec)-.2 E F0 .117(returns an error)2.617 F 5.117(.T)-.55 G .117(he function)
-419.211 588 R F1(loc)2.617 E(k_vec)-.2 E F0 .118(returns 0)2.617 F 1.143
-(on success.)108 600 R 1.143(If an error occurs,)6.143 F F1(loc)3.642 E(k_vec)
--.2 E F0 1.142(returns one of the follo)3.642 F 1.142(wing v)-.25 F 3.642
-(alues. In)-.25 F 1.142(addition, if)3.642 F F1(elistp)3.642 E F0 1.142(is not)
-3.642 F(NULL, it is set to point to the LOCK_REQ_T entry which w)108 612 Q
-(as being processed when the error occurred.)-.1 E(LOCK_GET_DEADLOCK)108 628.8
-Q .431(The speci\214ed)133 640.8 R F1(loc)2.931 E -.1(ke)-.2 G(r).1 E F0 -.1
-(wa)2.931 G 2.931(ss).1 G .431(elected as a victim in order to resolv)239.854
-640.8 R 2.932(ead)-.15 G 2.932(eadlock. In)407.718 640.8 R .432
-(this case, if the)2.932 F F1(con-)2.932 E(\215ict)133 652.8 Q F0(ar)2.901 E
-.401(gument is non-NULL, it is set to reference the identity of a lock)-.18 F
-.4(er holding the lock referenced)-.1 F(by)133 664.8 Q F1(elistp)2.585 E F0
-.085(at the time the request w)2.585 F .085(as denied.)-.1 F .086
-(\(This identity resides in static memory and may be o)5.086 F -.15(ve)-.15 G
--.2(r-).15 G(written by subsequent calls to)133 676.8 Q F1(loc)2.5 E(k_vec)-.2
-E F0(\).).31 E(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q
-99.315(ution August)-.2 F(1, 1995)2.5 E(2)535 732 Q EP
-%%Page: 3 8
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 117.9(DB_LOCK\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 117.9(anual DB_LOCK\(3\))340.17 48 R(LOCK_GET_ERR)108 84 Q(OR)-.4 E
-(An error occurred and the e)133 96 Q(xternal v)-.15 E(ariable)-.25 E/F1 10
-/Times-Italic@0 SF(errno)2.5 E F0(has been set to indicate the error)2.5 E(.)
--.55 E(LOCK_GET_NO)108 112.8 Q(THELD)-.4 E
-(The lock cannot be released, as it w)133 124.8 Q(as not held by the)-.1 E F1
-(loc)2.5 E -.1(ke)-.2 G(r).1 E F0(.).73 E(LOCK_GET_RESOURCE)108 141.6 Q 2.311(\
-The lock manager is unable to grant the requested locks because of limited int\
-ernal resources.)133 153.6 R(\(Releasing locks may allo)133 165.6 Q 2.5(wf)-.25
-G(uture calls to)249.4 165.6 Q F1(loc)2.5 E(k_vec)-.2 E F0(to succeed.\))2.5 E
-(LOCK_GET_TIMEOUT)108 182.4 Q 3.204(At)133 194.4 S .704(imeout ar)146.204 194.4
-R .704(gument w)-.18 F .705(as speci\214ed, and the requested locks were not a)
--.1 F -.25(va)-.2 G .705(ilable soon enough.).25 F .705(In this)5.705 F .625
-(case, if the)133 206.4 R F1(con\215ict)3.125 E F0(ar)3.125 E .624
-(gument is non-NULL, it is set to reference the identity of a lock)-.18 F .624
-(er holding the)-.1 F .551(lock referenced by)133 218.4 R F1(elistp)3.052 E F0
-.552(at the time the request w)3.052 F .552(as denied.)-.1 F .552
-(\(This identity resides in static memory)5.552 F(and may be o)133 230.4 Q -.15
-(ve)-.15 G(rwritten by subsequent calls to).15 E F1(loc)2.5 E(k_vec)-.2 E F0
-(\).).31 E(The)108 247.2 Q F1(loc)3.005 E -.1(ke)-.2 G(r).1 E F0(ar)3.005 E
-.504(gument speci\214ed to)-.18 F F1(loc)3.004 E(k_vec)-.2 E F0 .504
-(is a pointer to an untyped byte string which identi\214es the entity)3.004 F
-(requesting or releasing the lock.)108 259.2 Q(If)5 E F1(loc)2.5 E -.1(ke)-.2 G
-(r).1 E F0(is NULL, the calling process' pid is used instead.)2.5 E(The)108 276
-Q F1(timeout)4.628 E F0(ar)4.628 E 2.128(gument pro)-.18 F 2.128(vided to)-.15
-F F1(loc)4.628 E(k_vec)-.2 E F0 2.128(speci\214es a maximum interv)4.628 F
-2.128(al to w)-.25 F 2.128(ait for the locks to be)-.1 F 2.642(granted. If)108
-288 R F1(timeout)2.642 E F0 .142(is NULL, it is ignored, and)2.642 F F1(loc)
-2.642 E(k_vec)-.2 E F0 .141
-(will not return until all of the locks are acquired or)2.642 F
-(an error has occurred.)108 300 Q(The)108 316.8 Q F1(list)4.263 E F0 1.764
-(array pro)4.263 F 1.764(vided to)-.15 F F1(loc)4.264 E(k_vec)-.2 E F0 1.764
-(is typedef)4.264 F 2.764 -.5('d i).55 H 4.264(n<).5 G 1.764
-(db_lock.h> as LOCK_REQ_T)331.114 316.8 R 6.764(.A)-.74 G(LOCK_REQ_T)476.67
-316.8 Q(structure has at least the follo)108 328.8 Q
-(wing \214elds, which must be initialized before calling)-.25 E F1(loc)2.5 E
-(k_vec)-.2 E F0(:).31 E(enum lock)108 345.6 Q(op op;)-.1 E
-(The operation to be performed, which must be set to one of the follo)133 357.6
-Q(wing v)-.25 E(alues:)-.25 E(LOCK_GET)133 374.4 Q .201
-(Get a lock, as de\214ned by the v)158 386.4 R .201(alues of)-.25 F F1(loc)
-2.701 E -.1(ke)-.2 G(r).1 E F0(,).73 E F1(obj)2.701 E F0(and)2.7 E F1(loc)2.7 E
-(k_mode)-.2 E F0 5.2(.U).18 G .2(pon return from)435.99 386.4 R F1(loc)2.7 E
-(k_vec)-.2 E F0(,).31 E .161(if the)158 398.4 R F1(loc)2.661 E(kp)-.2 E F0 .162
-(\214eld is non-NULL, a reference to the acquired lock is stored there.)2.662 F
-.162(\(This reference)5.162 F(is in)158 410.4 Q -.25(va)-.4 G(lidated by an).25
-E 2.5(yc)-.15 G(all to)247.19 410.4 Q F1(loc)2.5 E(k_vec)-.2 E F0(or)2.5 E F1
-(loc)2.5 E(k_put)-.2 E F0(which releases the lock.\))2.5 E(LOCK_PUT)133 427.2 Q
-(The lock referenced by the contents of the)158 439.2 Q F1(loc)2.5 E(kp)-.2 E
-F0(\214eld is released.)2.5 E(LOCK_PUT_ALL)133 456 Q .759
-(All locks held by the)158 468 R F1(loc)3.259 E -.1(ke)-.2 G(r).1 E F0 .759
-(are released.)3.259 F(\(An)5.759 E 3.259(yl)-.15 G .759
-(ocks acquired as a part of the current call to)358.501 468 R F1(loc)158 480 Q
-(k_vec)-.2 E F0(are not considered for this operation\).)2.5 E(LOCK_PUT_OBJ)133
-496.8 Q 1.409(All locks held by the)158 508.8 R F1(loc)3.909 E -.1(ke)-.2 G(r)
-.1 E F0 3.909(,o).73 G 3.909(nt)287.704 508.8 S 1.409(he object)299.393 508.8 R
-F1(obj)3.909 E F0 3.909(,w).48 G 1.41(ith the mode speci\214ed by)367.98 508.8
-R F1(loc)3.91 E(k_mode)-.2 E F0 3.91(,a).18 G(re)532.23 508.8 Q 2.802
-(released. A)158 520.8 R F1(loc)2.802 E(k_mode)-.2 E F0 .301
-(of LOCK_NG indicates that all locks on the object should be released.)2.802 F
-(\(An)158 532.8 Q 3.053(yl)-.15 G .553
-(ocks acquired as a part of the current call to)184.233 532.8 R F1(loc)3.054 E
-(k_vec)-.2 E F0 .554(are not considered for this opera-)3.054 F(tion\).)158
-544.8 Q(const DBT obj;)108 561.6 Q
-(An untyped byte string which speci\214es the object to be lock)133 573.6 Q
-(ed or released.)-.1 E(const lock_mode_t lock_mode;)108 590.4 Q
-(The lock mode, used as an inde)133 602.4 Q 2.5(xi)-.15 G(nto)268.94 602.4 Q F1
-(lt)2.5 E F0 1.1 -.55('s c).68 H(on\215ict array).55 E(.)-.65 E
-(LOCK_T **lockp;)108 619.2 Q 2.5(Ap)133 631.2 S
-(ointer to a pointer to a lock reference.)147.72 631.2 Q(The)108 648 Q F1
-(nlist)2.5 E F0(ar)2.5 E(gument speci\214es the number of elements in the)-.18
-E F1(list)2.5 E F0(array)2.5 E(.)-.65 E 1.229(The function)108 664.8 R F1(loc)
-3.729 E(k_g)-.2 E(et)-.1 E F0 1.228(is a simple interf)3.728 F 1.228
-(ace to the)-.1 F F1(loc)3.728 E(k_vec)-.2 E F0(functionality)3.728 E 3.728(,a)
--.65 G 1.228(nd is equi)416.31 664.8 R -.25(va)-.25 G 1.228
-(lent to calling the).25 F F1(loc)108 676.8 Q(k_vec)-.2 E F0 .123
-(function with the)2.623 F F1(lt)2.623 E F0(and)2.623 E F1(loc)2.623 E -.1(ke)
--.2 G(r).1 E F0(ar)2.623 E .123(guments, NULL)-.18 F F1(timeout)2.623 E F0(,)
-.68 E F1(elistp)2.623 E F0(and)2.623 E F1(con\215ict)2.623 E F0(ar)2.623 E .124
-(guments, and a sin-)-.18 F .944(gle element)108 688.8 R F1(list)3.444 E F0
-(array)3.444 E 3.444(,f)-.65 G .944(or which the)203.606 688.8 R F1(op)3.444 E
-F0 .944(\214eld is LOCK_GET)3.444 F 3.444(,a)-.74 G .944(nd the)365.014 688.8 R
-F1(obj)3.444 E F0(,).48 E F1(loc)3.444 E(k_mode)-.2 E F0(and)3.444 E F1(loc)
-3.444 E(kp)-.2 E F0 .943(\214elds are)3.443 F(4.4 Berk)72 732 Q(ele)-.1 E 2.5
-(yD)-.15 G(istrib)132.57 732 Q 99.315(ution August)-.2 F(1, 1995)2.5 E(3)535
-732 Q EP
-%%Page: 4 9
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 117.9(DB_LOCK\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 117.9(anual DB_LOCK\(3\))340.17 48 R .509(represented by the ar)108
-84 R .509(guments of the same name.)-.18 F .51(Note that the type of the)5.509
-F/F1 10/Times-Italic@0 SF(obj)3.01 E F0(ar)3.01 E .51(gument to)-.18 F F1(loc)
-3.01 E(k_g)-.2 E(et)-.1 E F0 .51(is dif-)3.01 F .765(ferent from the)108 96 R
-F1(obj)3.265 E F0 .765(element found in the LOCK_REQ_T structure.)3.265 F(The)
-5.765 E F1(loc)3.265 E(k_g)-.2 E(et)-.1 E F0 .765(function returns success)
-3.265 F(and f)108 108 Q(ailure as described for the)-.1 E F1(loc)2.5 E(k_vec)
--.2 E F0(function.)2.5 E 1.186(The function)108 124.8 R F1(loc)3.686 E(k_put)
--.2 E F0 1.187(is a simple interf)3.687 F 1.187(ace to the)-.1 F F1(loc)3.687 E
-(k_vec)-.2 E F0(functionality)3.687 E 3.687(,a)-.65 G 1.187(nd is equi)416.515
-124.8 R -.25(va)-.25 G 1.187(lent to calling the).25 F F1(loc)108 136.8 Q
-(k_vec)-.2 E F0 .374(function with a single element)2.874 F F1(list)2.874 E F0
-(array)2.873 E 2.873(,f)-.65 G .373(or which the)314.82 136.8 R F1(op)2.873 E
-F0 .373(\214eld is LOCK_PUT and the)2.873 F F1(loc)2.873 E(kp)-.2 E F0(\214eld)
-2.873 E .631(is represented by the ar)108 148.8 R .631
-(gument of the same name.)-.18 F .632(Note that the type of the)5.632 F F1(loc)
-3.132 E(kp)-.2 E F0(ar)3.132 E .632(gument to)-.18 F F1(loc)3.132 E(k_put)-.2 E
-F0(is)3.132 E(dif)108 160.8 Q .275(ferent from the)-.25 F F1(loc)2.775 E(kp)-.2
-E F0 .274(element found in the LOCK_REQ_T structure.)2.775 F(The)5.274 E F1
-(loc)2.774 E(k_put)-.2 E F0 .274(function returns suc-)2.774 F(cess and f)108
-172.8 Q(ailure as described for the)-.1 E F1(loc)2.5 E(k_vec)-.2 E F0
-(function.)2.5 E .013(The function)108 189.6 R F1(loc)2.513 E(k_close)-.2 E F0
-.013(disassociates the calling process from the lock table)2.513 F F1(lt)2.513
-E F0 2.513(,a).68 G .013(fter releasing all locks held)431.636 189.6 R .228
-(or requested by that process.)108 201.6 R .228(The function)5.228 F F1(loc)
-2.728 E(k_close)-.2 E F0 .228(returns -1 on f)2.728 F .227(ailure, setting)-.1
-F F1(errno)2.727 E F0 2.727(,a).18 G .227(nd 0 on success.)474.329 201.6 R .433
-(The function)108 218.4 R F1(loc)2.933 E(k_unlink)-.2 E F0(destro)2.933 E .433
-(ys the lock table identi\214ed by the directory)-.1 F F1(path)2.933 E F0 2.933
-(,r).28 G(emo)440.636 218.4 Q .433(ving all \214les used to)-.15 F 1.005
-(implement the lock table.)108 230.4 R 1.005(\(The directory)6.005 F F1(path)
-3.505 E F0 1.005(is not remo)3.505 F -.15(ve)-.15 G 3.505(d.\) If).15 F 1.005
-(there are processes which ha)3.505 F 1.305 -.15(ve c)-.2 H(alled).15 E F1(loc)
-108 242.4 Q(k_open)-.2 E F0 .869(without calling)3.369 F F1(loc)3.369 E
-(k_close)-.2 E F0 .869
-(\(i.e., there are processes currently using the lock table\),)3.369 F F1(loc)
-3.37 E(k_unlink)-.2 E F0 .409(will f)108 254.4 R .408
-(ail without further action, unless the force \215ag is set, in which case)-.1
-F F1(loc)2.908 E(k_unlink)-.2 E F0 .408(will attempt to delete)2.908 F .807
-(the lock table \214les re)108 266.4 R -.05(ga)-.15 G .808(rdless of an).05 F
-3.308(yp)-.15 G .808(rocesses still using the lock table.)264.662 266.4 R(An)
-5.808 E 3.308(ya)-.15 G .808(ccesses to a remo)433.208 266.4 R -.15(ve)-.15 G
-3.308(dl).15 G(ock)525.56 266.4 Q .046(table will lik)108 278.4 R .046
-(ely result in une)-.1 F .045(xpected beha)-.15 F(vior)-.2 E 5.045(.T)-.55 G
-.045(he function)304.24 278.4 R F1(loc)2.545 E(k_unlink)-.2 E F0 .045
-(returns -1 on f)2.545 F .045(ailure, setting)-.1 F F1(errno)2.545 E F0(,).18 E
-(and 0 on success.)108 290.4 Q .798(In the case of catastrophic or system f)108
-307.2 R .798(ailure, it is possible to clean up a lock table by remo)-.1 F .799
-(ving all of the)-.15 F .38(\214les in the directory speci\214ed to the)108
-319.2 R F1(loc)2.88 E(k_cr)-.2 E(eate)-.37 E F0 .379
-(function, as lock table \214les are ne)2.88 F -.15(ve)-.25 G 2.879(rc).15 G
-.379(reated in an)461.543 319.2 R 2.879(yd)-.15 G(irec-)521.68 319.2 Q
-(tory other than the one speci\214ed to)108 331.2 Q F1(loc)2.5 E(k_cr)-.2 E
-(eate)-.37 E F0(.).18 E/F2 9/Times-Bold@0 SF(ERR)72 348 Q(ORS)-.27 E F0(The)108
-360 Q F1(loc)4.158 E(k_cr)-.2 E(eate)-.37 E F0 1.658(function may f)4.158 F
-1.658(ail and set)-.1 F F1(errno)4.158 E F0 1.658(for an)4.158 F 4.158(yo)-.15
-G 4.158(ft)353.71 360 S 1.659(he errors speci\214ed for the library routines)
-363.978 360 R F1(mmap)108 372 Q F0(\(2\),).19 E F1(open)2.5 E F0(\(2\) and).24
-E F1(malloc)2.5 E F0(\(3\).).31 E(The)108 388.8 Q F1(loc)4.692 E(k_open)-.2 E
-F0 2.192(function may f)4.692 F 2.192(ail and set)-.1 F F1(errno)4.692 E F0
-2.192(for an)4.692 F 4.692(yo)-.15 G 4.692(ft)353.87 388.8 S 2.191
-(he errors speci\214ed for the library routine)364.672 388.8 R F1(mmap)108
-400.8 Q F0(\(2\) and).19 E F1(open)2.5 E F0(\(2\).).24 E(The)108 417.6 Q F1
-(loc)2.57 E(k_close)-.2 E F0 .07(function may f)2.57 F .07(ail and set)-.1 F F1
-(errno)2.57 E F0 .07(for an)2.57 F 2.57(yo)-.15 G 2.57(ft)333.76 417.6 S .07
-(he errors speci\214ed for the library routine)342.44 417.6 R F1(close)2.57 E
-F0(\(2\)).18 E(and)108 429.6 Q F1(munmap)2.5 E F0(\(2\).).19 E(The)108 446.4 Q
-F1(loc)4.071 E(k_unlink)-.2 E F0 1.571(function may f)4.071 F 1.571
-(ail and set)-.1 F F1(errno)4.071 E F0 1.571(for an)4.071 F 4.071(yo)-.15 G
-4.07(ft)353.22 446.4 S 1.57(he errors speci\214ed for the library function)
-363.4 446.4 R F1(unlink)108 458.4 Q F0(\(2\) or the follo).67 E(wing:)-.25 E
-([EB)108 475.2 Q(USY])-.1 E(The lock table w)133 487.2 Q
-(as in use and the force \215ag w)-.1 E(as not set.)-.1 E F2(SEE ALSO)72 504 Q
-F1(db_btr)108 516 Q(ee)-.37 E F0(\(3\),).18 E F1(db_hash)2.5 E F0(\(3\),).28 E
-F1(db_lo)2.5 E(g)-.1 E F0(\(3\),).22 E F1(db_mpool)2.5 E F0(\(3\),).51 E F1
-(db_open)2.5 E F0(\(3\),).24 E F1(db_r)2.5 E(ecno)-.37 E F0(\(3\),).18 E F1
-(db_txn)2.5 E F0(\(3\)).24 E F2 -.09(BU)72 532.8 S(GS).09 E F0(The)108 544.8 Q
-F1(maxloc)2.656 E(ks)-.2 E F0 .156
-(parameter is a kluge, and should be deleted in f)2.656 F -.2(avo)-.1 G 2.657
-(ro).2 G 2.657(fd)381.055 544.8 S .157(ynamically e)392.042 544.8 R .157
-(xpanding the lock table.)-.15 F(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G
-(istrib)132.57 732 Q 99.315(ution August)-.2 F(1, 1995)2.5 E(4)535 732 Q EP
-%%Page: 1 10
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 124.57(DB_LOG\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 124.57(anual DB_LOG\(3\))340.17 48 R/F1 9/Times-Bold@0 SF -.18(NA)72
-84 S(ME).18 E F0(db_log \255 log-manager access method)108 96 Q F1(DESCRIPTION)
-72 112.8 Q F0 .486(The DB library is a f)108 124.8 R .485
-(amily of groups of functions that pro)-.1 F .485
-(vides a modular programming interf)-.15 F .485(ace to trans-)-.1 F .822
-(actions and record-oriented \214le access.)108 136.8 R .822
-(The library includes support for transaction, locking, logging and)5.822 F
-.258(\214le b)108 148.8 R(uf)-.2 E .258(fering functionality)-.25 F 2.758(,a)
--.65 G 2.758(sw)223.214 148.8 S .258(ell as v)237.082 148.8 R .258(arious inde)
--.25 F -.15(xe)-.15 G 2.758(da).15 G .258(ccess methods.)331.434 148.8 R(Man)
-5.258 E 2.758(yo)-.15 G 2.758(ft)427.878 148.8 S .258
-(he functional groups \(e.g.)436.746 148.8 R .528(the memory pool functions\) \
-are useful independently of the rest of the DB functions, although some func-)
-108 160.8 R .306(tional groups are e)108 172.8 R .306
-(xplicitly based on other functional groups \(e.g.)-.15 F .306
-(transactions and logging\).)5.306 F -.15(Fo)5.306 G 2.806(rag).15 G(eneral)
-515.57 172.8 Q .245(description of transactions, see)108 184.8 R/F2 10
-/Times-Italic@0 SF(db_txn)2.745 E F0 2.745(\(3\). F).24 F .245
-(or a general description of the access methods, see)-.15 F F2(db_open)2.745 E
-F0(\(3\)).24 E .308(and then the indi)108 196.8 R .308
-(vidual access method manual pages:)-.25 F F2(db_btr)2.807 E(ee)-.37 E F0
-(\(3\),).18 E F2(db_hash)2.807 E F0(\(3\),).28 E F2(db_lo)2.807 E(g)-.1 E F0
-.307(\(3\) and).22 F F2(db_r)2.807 E(ecno)-.37 E F0(\(3\).).18 E -.15(Fo)108
-208.8 S 3.635(rag).15 G 1.135(eneral description of the lock manager)138.45
-208.8 R 3.635(,s)-.4 G(ee)307.32 208.8 Q F2(db_loc)3.635 E(k)-.2 E F0 3.635
-(\(3\). F).67 F 1.135(or a general description of the memory)-.15 F
-(pool manager)108 220.8 Q 2.5(,s)-.4 G(ee)171.2 220.8 Q F2(db_mpool)2.5 E F0
-(\(3\).).51 E
-(This manual page describes speci\214c details of the logging access method.)
-108 237.6 Q .03(These functions pro)108 254.4 R .03
-(vide a general-purpose logging f)-.15 F .03(acility suf)-.1 F .03
-(\214cient for transaction management.)-.25 F .03(Logs can)5.03 F
-(be shared by multiple processes.)108 266.4 Q 3.717(Al)108 283.2 S 1.217
-(og is represented by the directory)121.717 283.2 R(,)-.65 E F2 1.217
-(not the \214le)3.717 F F0 3.717(,n).18 G 1.217(amed by the \214rst ar)323
-283.2 R 1.218(gument to)-.18 F F2(db_open)3.718 E F0 3.718(\(3\). The).24 F
-(\214rst)3.718 E(ar)108 295.2 Q .26
-(gument must be non-NULL, and the directory must already e)-.18 F(xist)-.15 E
-F2(db_open)2.76 E F0 .26(is called.)2.76 F .26(In that directory)5.26 F 2.76
-(,t)-.65 G(he)530.56 295.2 Q 3.448
-(log is stored in one or more \214les named in the format `)108 307.2 R
-(`log.YYYY)-.74 E(.MM.DD.HH.MM.SS')-1.29 E 3.448(', where)-.74 F -.74(``)108
-319.2 S(YYYY).74 E(.MM.DD.HH.SS')-1.29 E 2.507('i)-.74 G 2.507(st)220.497 319.2
-S .007(he approximate creation time of the log \214le, and is guaranteed to be\
- unique in)229.674 319.2 R(the directory)108 331.2 Q(.)-.65 E .465
-(The group of the created \214les is based on the system and directory def)108
-348 R .466(aults, and is not further speci\214ed by)-.1 F .073
-(the log access method.)108 360 R .072(All \214les are created with the)5.073 F
-F2(mode)2.572 E F0 .072(speci\214ed to)2.572 F F2(db_open)2.572 E F0 2.572(,\()
-.24 G .072(as described in)435.584 360 R F2 -.15(ch)2.572 G(mod).15 E F0
-(\(2\)\)).77 E(and modi\214ed by the process' umask v)108 372 Q(alue \(see)-.25
-E F2(umask)2.5 E F0(\(2\)\).).67 E(The)108 388.8 Q F2<8d61>2.5 E(gs)-.1 E F0
-(ar)2.5 E(gument to)-.18 E F2(db_open)2.5 E F0(must be 0 for the)2.5 E F2
-(db_lo)2.5 E(g)-.1 E F0(access method.)2.5 E F1 -.495(AC)72 405.6 S
-(CESS METHOD SPECIFIC INFORMA).495 E(TION)-.855 E F0 .571
-(The log access method speci\214c data structure pro)108 417.6 R .571(vided to)
--.15 F F2(db_open)3.071 E F0 .572(is typedef)3.071 F 1.572 -.5('d a).55 H .572
-(nd named LOGINFO.).5 F(A)5.572 E(LOGINFO structure has at least the follo)108
-429.6 Q(wing \214elds, which may be initialized before calling)-.25 E F2
-(db_open)2.5 E F0(:).24 E(of)108 446.4 Q(f_t max_\214le_size;)-.25 E 1.585
-(The maximum size of a single \214le in the log.)133 458.4 R 1.584
-(If not speci\214ed, the maximum size def)6.584 F 1.584(aults to an)-.1 F
-(implementation-speci\214c v)133 470.4 Q(alue.)-.25 E(int lorder;)108 487.2 Q
-.65(The byte order for inte)133 499.2 R .65
-(gers in the stored database metadata.)-.15 F .65
-(The number should represent the order)5.65 F .749(as an inte)133 511.2 R .749
-(ger; for e)-.15 F .749(xample, big endian order w)-.15 F .749
-(ould be the number 4,321.)-.1 F(If)5.749 E F2(lor)3.249 E(der)-.37 E F0 .749
-(is 0 \(no order is)3.249 F(speci\214ed\) the current host order is used.)133
-523.2 Q 1.284(If the log already e)108 540 R 1.284(xists, the v)-.15 F 1.285(a\
-lues speci\214ed for the parameters max_\214le_size and lorder are ignored in)
--.25 F -.1(fa)108 552 S -.2(vo)-.1 G 2.5(ro).2 G 2.5(ft)136.1 552 S(he v)144.71
-552 Q(alues used when the log w)-.25 E(as created.)-.1 E F1(DB OPERA)72 568.8 Q
-(TIONS)-.855 E F0 .687(The data part of the k)108 580.8 R -.15(ey)-.1 G .686(/\
-data pair used by the log access method is the same as for other access method\
-s.).15 F .837(The k)108 592.8 R 1.137 -.15(ey i)-.1 H 3.337(sd).15 G(if)159.421
-592.8 Q 3.337(ferent. Each)-.25 F .837(log record is identi\214ed by a log seq\
-uence number \(LSN\), which is stored in a)3.337 F(DBT)108 604.8 Q 2.702(,a)
--.74 G .202(nd which is used as the)136.902 604.8 R F2 -.1(ke)2.702 G(y)-.2 E
-F0 .202(for all log functions that tak)2.702 F(e)-.1 E F2 -.1(ke)2.701 G(y)-.2
-E F0(ar)2.701 E 2.701(guments. Applications)-.18 F .201(cannot create)2.701 F
-(LSN')108 616.8 Q .539(s, and all LSN')-.55 F 3.039(sp)-.55 G(ro)203.216 616.8
-Q .539(vided to functions as ar)-.15 F .539(guments must \214rst be retrie)-.18
-F -.15(ve)-.25 G 3.04(du).15 G .54(sing the)440.37 616.8 R F2(put)3.04 E F0(or)
-3.04 E F2(seq)3.04 E F0(func-)3.04 E 2.783(tions. T)108 628.8 R 2.783(op)-.8 G
-(ro)153.326 628.8 Q .283(vide a distinguished v)-.15 F .282
-(alue for applications, it is guaranteed that no v)-.25 F .282(alid LSN will e)
--.25 F -.15(ve)-.25 G 2.782(rh).15 G -2.25 -.2(av e)519.248 628.8 T(a)2.982 E
-(size of 0.)108 640.8 Q(Applications can compare LSN')108 657.6 Q 2.5(su)-.55 G
-(sing the)247.98 657.6 Q F2(lo)2.5 E(g_lsn_compar)-.1 E(e)-.37 E F0
-(function \(see belo)2.5 E(w\).)-.25 E .429(Applications can associate LSN')108
-674.4 R 2.929(sw)-.55 G .429(ith speci\214c log \214les.)253.586 674.4 R .429
-(The function)5.429 F F2(lo)2.929 E(g_lsn_\214le)-.1 E F0 .43(\(see belo)2.93 F
-.43(w\), returns the)-.25 F .214
-(name of the log \214le containing the record with a speci\214ed LSN.)108 686.4
-R .214(\(The mapping of LSN to \214le is needed for)5.214 F(4.4 Berk)72 732 Q
-(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q 99.315(ution August)-.2 F(3, 1995)
-2.5 E(1)535 732 Q EP
-%%Page: 2 11
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 124.57(DB_LOG\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 124.57(anual DB_LOG\(3\))340.17 48 R .397(database administration.)
-108 84 R -.15(Fo)5.397 G 2.897(re).15 G .398
-(xample, a transaction manager typically records the earliest LSN needed for)
-231.931 84 R .519(restart, and the database administrator may w)108 96 R .519
-(ant to archi)-.1 F .819 -.15(ve l)-.25 H .519(og \214les to tape when the).15
-F 3.018(yc)-.15 G .518(ontain only LSN')465.624 96 R(s)-.55 E
-(before the earliest one needed for restart.\))108 108 Q
-(Applications can truncate the log \214le up to a speci\214c LSN using the)108
-124.8 Q/F1 10/Times-Italic@0 SF(lo)2.5 E(g_trunc)-.1 E F0(function \(see belo)
-2.5 E(w\).)-.25 E .221(The functions returned by)108 141.6 R F1(db_open)2.721 E
-F0 .221(for the log access method are as described in)2.721 F F1(db_open)2.721
-E F0 2.722(,w).24 G .222(ith the follo)482.586 141.6 R(w-)-.25 E(ing e)108
-153.6 Q(xceptions and additions:)-.15 E 5.28(type The)108 170.4 R
-(type is DB_LOG.)2.5 E 10.28(del The)108 187.2 R F1(del)3.505 E F0 1.005
-(function al)3.505 F -.1(wa)-.1 G 1.005
-(ys returns an error for the log-manager access method, setting).1 F F1(errno)
-3.504 E F0 1.004(to EIN-)3.504 F -1.35(VA)133 199.2 S(L.)1.35 E
-(int \(*log_\215ush\)\(const DB *db, const DBT *lsn\);)108 216 Q(The)133 228 Q
-F1(lo)2.866 E(g_\215ush)-.1 E F0 .367
-(function \215ushes the log up to and including the log record)2.866 F F1(lsn)
-2.867 E F0 5.367(.T).24 G .367(he function)454.926 228 R F1(lo)2.867 E
-(g_\215ush)-.1 E F0(returns -1 on f)133 240 Q(ailure, setting)-.1 E F1(errno)
-2.5 E F0 2.5(,a).18 G(nd 0 on success.)278.61 240 Q
-(int \(*log_lsn_compare\)\(const DB *,)108 256.8 Q .255
-(const DBT *lsn1, const DBT *lsn2\); A pointer to a function which is pro)183
-268.8 R .255(vided to permit)-.15 F .312(applications to compare LSN')133 280.8
-R 2.812(s. The)-.55 F F1(lo)2.812 E(g_lsn_compar)-.1 E(e)-.37 E F0 .312
-(function returns an inte)2.812 F .313(ger less than, equal to,)-.15 F .058
-(or greater than zero if the \214rst LSN is considered to be respecti)133 292.8
-R -.15(ve)-.25 G .058(ly less than, equal to, or greater than).15 F
-(the second LSN.)133 304.8 Q(int \(*log_lsn_\214le\)\(const DB *db,)108 321.6 Q
-(const DBT *lsn, char *name\);)183 333.6 Q(The)133 345.6 Q F1(lo)3.21 E
-(g_lsn_\214le)-.1 E F0 .71
-(function stores a pointer to the name of the \214le containing)3.21 F F1(lsn)
-3.211 E F0 .711(in the address refer)3.211 F(-)-.2 E .293(enced by)133 357.6 R
-F1(name)2.793 E(.)-.15 E F0 .293(This pointer is to an internal static object,\
- and subsequent calls to the same function)5.293 F
-(will modify the same object.)133 369.6 Q(The function)133 386.4 Q F1(lo)2.5 E
-(g_lsn_\214le)-.1 E F0(returns -1 on f)2.5 E(ailure, setting)-.1 E F1(errno)2.5
-E F0 2.5(,a).18 G(nd 0 on success.)381.56 386.4 Q
-(int \(*log_unlink\)\(const char *path, int force\);)108 403.2 Q(The)133 415.2
-Q F1(lo)3.275 E(g_unlink)-.1 E F0 .775(function destro)3.275 F .775
-(ys the log represented by)-.1 F F1(path)3.275 E F0 5.775(.I).28 G 3.275(ft)
-394.745 415.2 S(he)404.13 415.2 Q F1(for)3.275 E(ce)-.37 E F0 .776
-(parameter is not set to 1)3.275 F .725
-(and there are other processes using the log, then)133 427.2 R F1(lo)3.224 E
-(g_unlink)-.1 E F0 .724(will return -1, setting)3.224 F F1(errno)3.224 E F0
-.724(to EB)3.224 F(USY)-.1 E(.)-1.29 E(If)133 439.2 Q F1(for)2.831 E .331
-(ce is not set or ther)-.37 F 2.831(ea)-.37 G 1.071 -.37(re n)244.287 439.2 T
-2.831(op).37 G -.45(ro)272.909 439.2 S .331(cesses using the lo).45 F .532 -.1
-(g, t)-.1 H .332(hen all \214les).1 F F0 .332(used by the log are destro)2.832
-F(yed.)-.1 E F1(lo)133 451.2 Q(g_unlink)-.1 E F0(will return -1 on f)2.5 E
-(ailure, setting)-.1 E F1(errno)2.5 E F0 2.5(,a).18 G(nd 0 on success.)337.96
-451.2 Q(int \(*log_trunc\)\(const DB *db, const DBT *lsn\);)108 468 Q(The)133
-480 Q F1(lo)2.601 E(g_trunc)-.1 E F0 .101
-(function truncates the log up to an LSN which is less than)2.601 F F1(lsn)2.6
-E F0 5.1(.T).24 G .1(he function)453.24 480 R F1(lo)2.6 E(g_trunc)-.1 E F0
-(returns -1 on f)133 492 Q(ailure, setting)-.1 E F1(errno)2.5 E F0 2.5(,a).18 G
-(nd 0 on success.)278.61 492 Q 9.72(put A)108 508.8 R .339
-(log record containing)2.839 F F1(data)2.839 E F0 .339(is appended to the log.)
-2.839 F(Unlik)5.339 E 2.84(et)-.1 G(he)382.44 508.8 Q F1(put)2.84 E F0 .34
-(functions for other access meth-)2.84 F .789(ods, the k)133 520.8 R 1.089 -.15
-(ey p)-.1 H .788(arameter is not initialized by the application, instead, the \
-LSN assigned to the data is).15 F(returned in the)133 532.8 Q F1 -.1(ke)2.5 G
-(y)-.2 E F0(parameter)2.5 E(.)-.55 E 1.157(The caller is responsible for pro)
-133 549.6 R 1.157(viding an)-.15 F 3.657(yn)-.15 G 1.157(ecessary structure to)
-318.267 549.6 R F1 1.157(data .)3.657 F F0(\(F)6.157 E 1.157(or e)-.15 F 1.157
-(xample, in a write-)-.15 F .267
-(ahead logging protocol, the application must understand what part of)133 561.6
-R F1(data)2.767 E F0 .266(is an operation code, what)2.766 F .622
-(part is redo information, and what part is undo information.)133 573.6 R .622
-(In addition, most transaction managers)5.622 F .985(will store in)133 585.6 R
-F1(data)3.485 E F0 .985(the LSN of the pre)3.485 F .984
-(vious log record for the same transaction, to support chaining)-.25 F
-(back through the transaction')133 597.6 Q 2.5(sl)-.55 G
-(og records during undo.\))258.54 597.6 Q(The parameter)133 614.4 Q F1<8d61>2.5
-E(g)-.1 E F0(must be set to 0 or e)2.5 E(xactly one of the follo)-.15 E(wing v)
--.25 E(alues:)-.25 E(R_CHECKPOINT)133 631.2 Q .5(Specify the k)158 643.2 R -.15
-(ey)-.1 G .5(/data pair of the current call as the one to be returned when the)
-.15 F F1(seq)3 E F0 .5(function is)3 F(ne)158 655.2 Q
-(xt called with the R_CHECKPOINT \215ag.)-.15 E(4.4 Berk)72 732 Q(ele)-.1 E 2.5
-(yD)-.15 G(istrib)132.57 732 Q 99.315(ution August)-.2 F(3, 1995)2.5 E(2)535
-732 Q EP
-%%Page: 3 12
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 124.57(DB_LOG\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 124.57(anual DB_LOG\(3\))340.17 48 R(R_FLUSH)133 84 Q
-(Flush immediately \(ignoring an)158 96 Q 2.5(yp)-.15 G
-(ossibility for group commit\).)296.74 96 Q 9.17(seq The)108 112.8 R/F1 10
-/Times-Italic@0 SF(seq)2.5 E F0(function tak)2.5 E(es the follo)-.1 E
-(wing additional \215ag:)-.25 E(R_CHECKPOINT)133 129.6 Q .184(The last k)158
-141.6 R -.15(ey)-.1 G .184(/data pair stored by the).15 F F1(put)2.684 E F0
-.183(function \(using the R_CHECKPOINT \215ag\) is returned,)2.684 F .216
-(and the cursor is set or initialized to reference it.)158 153.6 R .216(The e)
-5.216 F .216(xpected use of this \215ag is during restart)-.15 F .801
-(and to determine what part of the log must be a)158 165.6 R -.25(va)-.2 G .801
-(ilable for restart.).25 F .801(Therefore, the log record)5.801 F(retrie)158
-177.6 Q -.15(ve)-.25 G 3.352(dw).15 G .853
-(ith R_CHECKPOINT should contain all the information that the transaction man-)
-203.712 177.6 R(ager will need for this purpose.)158 189.6 Q 4.17(sync The)108
-206.4 R F1(sync)3.135 E F0 .635(function al)3.135 F -.1(wa)-.1 G .635
-(ys returns an error for the log-manager access method, setting).1 F F1(errno)
-3.134 E F0 .634(to EIN-)3.134 F -1.35(VA)133 218.4 S(L.)1.35 E/F2 9
-/Times-Bold@0 SF(SEE ALSO)72 235.2 Q F1(db_btr)108 247.2 Q(ee)-.37 E F0(\(3\),)
-.18 E F1(db_hash)2.5 E F0(\(3\),).28 E F1(db_loc)2.5 E(k)-.2 E F0(\(3\),).67 E
-F1(db_mpool)2.5 E F0(\(3\),).51 E F1(db_open)2.5 E F0(\(3\),).24 E F1(db_r)2.5
-E(ecno)-.37 E F0(\(3\),).18 E F1(db_txn)2.5 E F0(\(3\)).24 E(4.4 Berk)72 732 Q
-(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q 99.315(ution August)-.2 F(3, 1995)
-2.5 E(3)535 732 Q EP
-%%Page: 1 13
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 110.12(DB_MPOOL\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 110.12(anual DB_MPOOL\(3\))340.17 48 R/F1 9/Times-Bold@0 SF -.18(NA)
-72 84 S(ME).18 E F0(db_mpool \255 general purpose shared memory b)108 96 Q(uf)
--.2 E(fer pool)-.25 E F1(SYNOPSIS)72 112.8 Q/F2 10/Times-Bold@0 SF
-(#include <db)108 124.8 Q(.h>)-.4 E(#include <mpool.h>)108 136.8 Q(int)108
-160.8 Q(mpool_cr)108 172.8 Q
-(eate\(char *path, mode_t mode, size_t cachesize, u_long \215ags\);)-.18 E
-(MPOOL *)108 196.8 Q(mpool_open\(char *path\);)108 208.8 Q(int)108 232.8 Q
-(mpool_close\(MPOOL *mp\);)108 244.8 Q(MPOOLFILE *)108 268.8 Q(mpool_f)108
-280.8 Q(open\(MPOOL *mp, char *path, size_t pagesize, v)-.25 E(oid *pgcookie,)
--.1 E(int \(*pgin\)\(MPOOLFILE *mpf)158 292.8 Q(,)-.15 E(pgno_t pgno, v)188
-304.8 Q(oid *pgaddr)-.1 E 2.5(,v)-.92 G(oid *pgcookie\),)311.91 304.8 Q
-(int \(*pgout\)\(MPOOLFILE *mpf)158 316.8 Q(,)-.15 E(pgno_t pgno, v)188 328.8 Q
-(oid *pgaddr)-.1 E 2.5(,v)-.92 G(oid *pgcookie\);)311.91 328.8 Q(int)108 352.8
-Q(mpool_fclose\(MPOOLFILE *mpf\);)108 364.8 Q -.1(vo)108 388.8 S(id *).1 E
-(mpool_get\(MPOOLFILE *mpf)108 400.8 Q 2.5(,p)-.15 G(gno_t *pgnoaddr)252.02
-400.8 Q 2.5(,u)-.92 G(_long \215ags,)334.73 400.8 Q
-(int \(*callback\)\(MPOOLFILE *mpf)158 412.8 Q 2.5(,p)-.15 G(gno_t pgno\)\);)
-318.97 412.8 Q(int)108 436.8 Q(mpool_put\(MPOOLFILE *mpf)108 448.8 Q 2.5(,v)
--.15 G(oid *pgaddr)253.04 448.8 Q 2.5(,u)-.92 G(_long \215ags\);)314.64 448.8 Q
-(int)108 472.8 Q(mpool_sync\(MPOOLFILE *mpf\);)108 484.8 Q(int)108 508.8 Q
-(mpool_unlink\(const char *path, int f)108 520.8 Q(or)-.25 E(ce\);)-.18 E -.1
-(vo)108 544.8 S(id).1 E(mpool_stat\(MPOOL *mp, FILE *fp\);)108 556.8 Q F1
-(DESCRIPTION)72 573.6 Q F0 .485(The DB library is a f)108 585.6 R .485
-(amily of groups of functions that pro)-.1 F .486
-(vides a modular programming interf)-.15 F .486(ace to trans-)-.1 F .823
-(actions and record-oriented \214le access.)108 597.6 R .822
-(The library includes support for transaction, locking, logging and)5.822 F
-.258(\214le b)108 609.6 R(uf)-.2 E .258(fering functionality)-.25 F 2.758(,a)
--.65 G 2.758(sw)223.214 609.6 S .258(ell as v)237.082 609.6 R .258(arious inde)
--.25 F -.15(xe)-.15 G 2.758(da).15 G .258(ccess methods.)331.434 609.6 R(Man)
-5.258 E 2.758(yo)-.15 G 2.758(ft)427.878 609.6 S .258
-(he functional groups \(e.g.)436.746 609.6 R .528(the memory pool functions\) \
-are useful independently of the rest of the DB functions, although some func-)
-108 621.6 R .306(tional groups are e)108 633.6 R .306
-(xplicitly based on other functional groups \(e.g.)-.15 F .306
-(transactions and logging\).)5.306 F -.15(Fo)5.306 G 2.806(rag).15 G(eneral)
-515.57 633.6 Q .245(description of transactions, see)108 645.6 R/F3 10
-/Times-Italic@0 SF(db_txn)2.745 E F0 2.745(\(3\). F).24 F .245
-(or a general description of the access methods, see)-.15 F F3(db_open)2.745 E
-F0(\(3\)).24 E .307(and then the indi)108 657.6 R .307
-(vidual access method manual pages:)-.25 F F3(db_btr)2.808 E(ee)-.37 E F0
-(\(3\),).18 E F3(db_hash)2.808 E F0(\(3\),).28 E F3(db_lo)2.808 E(g)-.1 E F0
-.308(\(3\) and).22 F F3(db_r)2.808 E(ecno)-.37 E F0(\(3\).).18 E -.15(Fo)108
-669.6 S 3.635(rag).15 G 1.135(eneral description of the lock manager)138.45
-669.6 R 3.635(,s)-.4 G(ee)307.32 669.6 Q F3(db_loc)3.635 E(k)-.2 E F0 3.635
-(\(3\). F).67 F 1.135(or a general description of the memory)-.15 F
-(pool manager)108 681.6 Q 2.5(,s)-.4 G(ee)171.2 681.6 Q F3(db_mpool)2.5 E F0
-(\(3\).).51 E(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q
-99.315(ution August)-.2 F(1, 1995)2.5 E(1)535 732 Q EP
-%%Page: 2 14
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 110.12(DB_MPOOL\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 110.12(anual DB_MPOOL\(3\))340.17 48 R
-(This manual page describes speci\214c details of the memory pool interf)108 84
-Q(ace.)-.1 E(The)108 100.8 Q/F1 10/Times-Italic@0 SF(db_mpool)3.682 E F0 1.182
-(function is the library interf)3.682 F 1.183(ace intended to pro)-.1 F 1.183
-(vide general-purpose, page-oriented b)-.15 F(uf)-.2 E(fer)-.25 E .16
-(management of one or more \214les.)108 112.8 R .16(While designed to w)5.16 F
-.16(ork with the other DB functions, these functions are)-.1 F .604
-(also useful for more general purposes.)108 124.8 R .604
-(The memory pools \(MPOOL)5.604 F -.55('s)-.92 G 3.104(\)a).55 G .605
-(re referred to in this document as)404.18 124.8 R .985(simply `)108 136.8 R
-(`pools')-.74 E 3.485('. Pools)-.74 F .985(may be shared between processes.)
-3.485 F .985(Pools are usually \214lled by pages from one or)5.985 F .673
-(more \214les \(MPOOLFILE')108 148.8 R 3.173(s\). P)-.55 F .674
-(ages in the pool are replaced in LR)-.15 F 3.174(U\()-.4 G .674
-(least-recently-used\) order)392.318 148.8 R 3.174(,w)-.4 G .674(ith each)
-507.946 148.8 R(ne)108 160.8 Q 4.243(wp)-.25 G 1.743
-(age replacing the page which has been unused the longest.)133.653 160.8 R -.15
-(Pa)6.742 G 1.742(ges retrie).15 F -.15(ve)-.25 G 4.242(df).15 G 1.742
-(rom the pool using)459.494 160.8 R F1(mpool_g)108 172.8 Q(et)-.1 E F0 1.255
-(are `)3.755 F(`pinned')-.74 E 3.755('i)-.74 G 3.755(nm)215.435 172.8 S(emory)
-231.97 172.8 Q 3.755(,b)-.65 G 3.755(yd)268.125 172.8 S(ef)281.88 172.8 Q 1.256
-(ault, until the)-.1 F 3.756(ya)-.15 G 1.256(re returned to the pool using the)
-358.168 172.8 R F1(mpool_put)3.756 E F0(function.)108 184.8 Q .934
-(The function)108 201.6 R F1(mpool_cr)3.434 E(eate)-.37 E F0 .934
-(creates and initializes the memory pool identi\214ed by the)3.434 F F1(path)
-3.433 E F0(directory)3.433 E 5.933(.T)-.65 G(his)528.33 201.6 Q .931
-(directory must already e)108 213.6 R .931(xist when)-.15 F F1(mpool_cr)3.431 E
-(eate)-.37 E F0 .931(is called.)3.431 F .932
-(If the memory pool identi\214ed by)5.931 F F1(path)3.432 E F0(already)3.432 E
--.15(ex)108 225.6 S .045(ists, then).15 F F1(mpool_cr)2.545 E(eate)-.37 E F0
-.045(returns success without further action.)2.545 F .045
-(The \214les associated with the memory pool)5.045 F .87
-(are created in the directory speci\214ed by)108 237.6 R F1(path)3.37 E F0 5.87
-(.\().28 G .87(The group of the created \214les is based on the system and)
-304.08 237.6 R .258(directory def)108 249.6 R .258
-(aults, and is not further speci\214ed by)-.1 F F1(mpool_cr)2.758 E(eate)-.37 E
-F0 2.758(.\) All).18 F .258(\214les created by)2.758 F F1(mpool_cr)2.758 E
-(eate)-.37 E F0 .258(are cre-)2.758 F .048(ated with mode)108 261.6 R F1(mode)
-2.548 E F0 .049(\(as described in)2.548 F F1 -.15(ch)2.549 G(mod).15 E F0 .049
-(\(2\)\) and modi\214ed by the process' umask v).77 F .049(alue \(see)-.25 F F1
-(umask)2.549 E F0(\(2\)\).).67 E(The)108 278.4 Q F1(cac)2.544 E(hesize)-.15 E
-F0(ar)2.544 E .044(gument speci\214es the size of the pool in bytes, and shoul\
-d be the size of the normal w)-.18 F(orking)-.1 E .509(set of the application \
-with some small amount of additional memory for unusual situations.)108 290.4 R
-.509(If the number)5.509 F .362(of bytes currently `)108 302.4 R(`pinned')-.74
-E 2.862('i)-.74 G 2.862(nm)226.828 302.4 S .362(emory e)242.47 302.4 R(xceeds)
--.15 E F1(cac)2.861 E(hesize)-.15 E F0 2.861(,t).18 G(he)351.734 302.4 Q F1
-(db_mpool)2.861 E F0 .361(functions will attempt to allocate)2.861 F
-(more memory and do not necessarily f)108 314.4 Q(ail, although the)-.1 E 2.5
-(ym)-.15 G(ay suf)341.61 314.4 Q(fer performance de)-.25 E(gradation.)-.15 E
-(The)108 331.2 Q F1<8d61>2.5 E(gs)-.1 E F0(ar)2.5 E(gument is set by)-.18 E F1
-(or)2.5 E F0('ing an).73 E 2.5(yo)-.15 G 2.5(ft)272.73 331.2 S(he follo)281.34
-331.2 Q(wing v)-.25 E(alues:)-.25 E(MPOOL_PRIV)108 348 Q -1.11(AT)-1.35 G(E)
-1.11 E(The pool is not shared by other processes or threads, so no locking of \
-pool resources is required.)144 360 Q .115(The function)108 376.8 R F1
-(mpool_open)2.615 E F0 .115
-(returns a pointer to the memory pool identi\214ed by)2.615 F F1(path)2.615 E
-F0 2.615(,w).28 G .115(hich must ha)447.525 376.8 R .415 -.15(ve a)-.2 H
-(lready).15 E .036(been created by a call to)108 388.8 R F1(mpool_cr)2.536 E
-(eate)-.37 E F0 5.036(.T).18 G .036(he process must ha)276.074 388.8 R .336
--.15(ve p)-.2 H .036(ermission to read and write \214les with o).15 F(wn-)-.25
-E 1.157(ers, groups and permissions as described for)108 400.8 R F1(mpool_cr)
-3.657 E(eate)-.37 E F0 6.157(.T).18 G(he)365.075 400.8 Q F1(mpool_open)3.657 E
-F0 1.157(function returns NULL on)3.657 F -.1(fa)108 412.8 S(ilure, setting).1
-E F1(errno)2.5 E F0(.).18 E(The)108 429.6 Q F1(mpool_close)6.383 E F0 3.883
-(function closes the pool indicated by the MPOOL pointer)6.383 F F1(mp)6.383 E
-F0 6.383(,a).19 G 6.382(sr)480.026 429.6 S 3.882(eturned by)493.628 429.6 R F1
-(mpool_open)108 441.6 Q F0 5.047(.T).24 G .047(his function does)171.337 441.6
-R/F2 10/Times-Bold@0 SF(not)2.547 E F0 .047(imply a call to)2.547 F F1
-(mpool_sync)2.547 E F0 .047(\(or to)2.547 F F1(mpool_fclose)2.547 E F0 2.547
-(\)i).18 G .047(.e. no pages are writ-)455.951 441.6 R .404
-(ten to the source \214le as as a result of calling)108 453.6 R F1(mpool_close)
-2.904 E F0 5.404(.T).18 G .404(he function)354.658 453.6 R F1(mpool_close)2.904
-E F0 .403(returns -1 on f)2.904 F(ailure,)-.1 E(setting)108 465.6 Q F1(errno)
-2.5 E F0 2.5(,a).18 G(nd 0 on success.)169.01 465.6 Q .827(The function)108
-482.4 R F1(mpool_fopen)3.327 E F0 .827(opens a \214le for b)3.327 F(uf)-.2 E
-.828(fering in the pool speci\214ed by the MPOOL ar)-.25 F 3.328(gument. The)
--.18 F F1(path)108 494.4 Q F0(ar)2.85 E .349
-(gument is the name of the \214le to be opened.)-.18 F(The)5.349 E F1(pa)2.849
-E -.1(ge)-.1 G(size).1 E F0(ar)2.849 E .349
-(gument is the size, in bytes, of the unit)-.18 F .738(of transfer between the\
- application and the pool, although not necessarily the unit of transfer betwe\
-en the)108 506.4 R .12(pool and the source \214le.)108 518.4 R .12
-(Applications not kno)5.12 F .12
-(wing the page size of the source \214le should retrie)-.25 F .42 -.15(ve t)
--.25 H .12(he meta-).15 F .234(data from the \214le using a page size that is \
-correct for the metadata, then close and reopen the \214le, or)108 530.4 R
-2.735(,o)-.4 G(ther)521.32 530.4 Q(-)-.2 E
-(wise determine the page size before calling)108 542.4 Q F1(mpool_fopen)2.5 E
-F0(.).24 E .416(If the)108 559.2 R F1(pgin)2.916 E F0 .416(function is speci\
-\214ed, it is called each time a page is read into the memory pool from the so\
-urce)2.916 F 2.835(\214le. If)108 571.2 R(the)2.835 E F1(pgout)2.835 E F0 .336
-(function is speci\214ed, it is called each time a page is written to the sour\
-ce \214le.)2.835 F .336(Both func-)5.336 F .834
-(tions are called with the MPOOLFILE pointer returned from)108 583.2 R F1
-(mpool_fopen)3.333 E F0 3.333(,t).24 G .833(he page number)421.815 583.2 R
-3.333(,ap)-.4 G .833(ointer to)505.557 583.2 R .014
-(the page being read or written, and the ar)108 595.2 R(gument)-.18 E F1
-(pgcookie)2.515 E F0 5.015(.I).18 G 2.515(fe)351.695 595.2 S .015
-(ither function f)361.98 595.2 R .015(ails, it should return non-zero)-.1 F
-(and set)108 607.2 Q F1(errno)2.5 E F0 2.5(,i).18 G 2.5(nw)168.73 607.2 S
-(hich case the)183.45 607.2 Q F1(db_mpool)2.5 E F0
-(function calling it will also f)2.5 E(ail, lea)-.1 E(ving)-.2 E F1(errno)2.5 E
-F0(intact.)2.5 E(The)108 624 Q F1(mpool_fclose)2.705 E F0 .204
-(function closes the source \214le indicated by the MPOOLFILE pointer)2.705 F
-F1(mpf)2.704 E F0 5.204(.T)1.96 G .204(his function)492.296 624 R(does)108 636
-Q F2(not)3.615 E F0 1.115(imply a call to)3.615 F F1(mpool_sync)3.615 E F0
-3.615(,i).31 G 1.115
-(.e. no pages are written to the source \214le as as a result of calling)
-268.885 636 R F1(mpool_fclose)108 648 Q F0 5(.T).18 G(he function)175.12 648 Q
-F1(mpool_fclose)2.5 E F0(returns -1 on f)2.5 E(ailure, setting)-.1 E F1(errno)
-2.5 E F0 2.5(,a).18 G(nd 0 on success.)424.33 648 Q .019(The function)108 664.8
-R F1(mpool_g)2.519 E(et)-.1 E F0 .019
-(returns a pointer to the page with the page number speci\214ed by)2.519 F F1
-(pgnoaddr)2.518 E F0 2.518(,f).73 G .018(rom the)509.152 664.8 R .986
-(source \214le speci\214ed by the MPOOLFILE pointer)108 676.8 R F1(mpf)3.486 E
-F0 5.986(.I)1.96 G 3.486(ft)342.268 676.8 S .987(he page does not e)351.864
-676.8 R .987(xist or cannot be retrie)-.15 F -.15(ve)-.25 G(d,).15 E F1
-(mpool_g)108 688.8 Q(et)-.1 E F0(returns NULL and sets errno.)2.5 E(4.4 Berk)72
-732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q 99.315(ution August)-.2 F
-(1, 1995)2.5 E(2)535 732 Q EP
-%%Page: 3 15
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 110.12(DB_MPOOL\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 110.12(anual DB_MPOOL\(3\))340.17 48 R(The)108 84 Q/F1 10
-/Times-Italic@0 SF<8d61>2.5 E(gs)-.1 E F0(ar)2.5 E(gument is set by)-.18 E F1
-(or)2.5 E F0('ing an).73 E 2.5(yo)-.15 G 2.5(ft)272.73 84 S(he follo)281.34 84
-Q(wing v)-.25 E(alues:)-.25 E(MPOOL_CALLB)108 100.8 Q -.4(AC)-.35 G(K).4 E 1.04
-(After the page number has been determined, b)133 112.8 R 1.04(ut before an)-.2
-F 3.54(yo)-.15 G 1.04(ther process or thread can access the)388.26 112.8 R .471
-(page, the function speci\214ed by the)133 124.8 R F1(callbac)2.971 E(k)-.2 E
-F0(ar)2.971 E .471(gument is called.)-.18 F .471(If the function f)5.471 F .472
-(ails, it should return)-.1 F 1.11(non-zero and set)133 136.8 R F1(errno)3.61 E
-F0 3.61(,i).18 G 3.61(nw)236.21 136.8 S 1.11(hich case)252.04 136.8 R F1
-(mpool_g)3.61 E(et)-.1 E F0 1.11(will also f)3.61 F 1.11(ail, lea)-.1 F(ving)
--.2 E F1(errno)3.61 E F0 3.61(intact. The)3.61 F F1(callbac)3.61 E(k)-.2 E F0
-1.012(function is called with the MPOOLFILE pointer returned from)133 148.8 R
-F1(mpool_fopen)3.512 E F0 1.013(and the page number)3.513 F(.)-.55 E .228
-(This functionality is commonly used when page locking is required, b)133 160.8
-R .227(ut the page number of the page)-.2 F(being retrie)133 172.8 Q -.15(ve)
--.25 G 2.5(di).15 G 2.5(sn)198.14 172.8 S(ot kno)209.53 172.8 Q(wn.)-.25 E
-(MPOOL_CREA)108 189.6 Q(TE)-1.11 E(If the speci\214ed page does not e)133 201.6
-Q(xist, create it.)-.15 E(MPOOL_LAST)108 218.4 Q 2.105
-(Return the last page of the source \214le and cop)133 230.4 R 4.605(yi)-.1 G
-2.106(ts page number to the location referenced by)347.25 230.4 R F1(pgnoaddr)
-133 242.4 Q F0(.).73 E(MPOOL_NEW)108 259.2 Q(Create a ne)133 271.2 Q 2.5(wp)
--.25 G(age in the \214le and cop)192.45 271.2 Q 2.5(yi)-.1 G
-(ts page number to the location referenced by)290.67 271.2 Q F1(pgnoaddr)2.5 E
-F0(.).73 E(MPOOL_NOPIN)108 288 Q(Don')133 300 Q 2.918(tp)-.18 G .418
-(in the page into memory)164.068 300 R 5.418(.\()-.65 G .417
-(This \215ag is intended for deb)274.108 300 R .417(ugging purposes, when it')
--.2 F 2.917(so)-.55 G .417(ften use-)504.873 300 R .972(ful to e)133 312 R .972
-(xamine pages which are currently held by other parts of the application.)-.15
-F -.15(Pa)5.973 G .973(ges retrie).15 F -.15(ve)-.25 G 3.473(di).15 G(n)535 312
-Q .529(this manner don')133 324 R 3.029(tn)-.18 G .528
-(eed to be returned to the memory pool, i.e. the)212.457 324 R 3.028(ys)-.15 G
-(hould)413.95 324 Q/F2 10/Times-Bold@0 SF(not)3.028 E F0 .528
-(be speci\214ed as ar)3.028 F(gu-)-.18 E(ments to the)133 336 Q F1(mpool_put)
-2.5 E F0(routine.\))2.5 E(Created pages ha)108 352.8 Q .3 -.15(ve a)-.2 H
-(ll their bytes set to 0.).15 E 2.078(All pages returned by)108 369.6 R F1
-(mpool_g)4.578 E(et)-.1 E F0 2.079
-(\(unless the MPOOL_NOPIN \215ag is speci\214ed\), will be retained \(i.e.)
-4.578 F -.74(``)108 381.6 S(pinned').74 E
-('\) in the pool until a subsequent call to)-.74 E F1(mpool_put)2.5 E F0(.).68
-E .077(The function)108 398.4 R F1(mpool_put)2.577 E F0 .076
-(indicates that the page referenced by)2.577 F F1(pgaddr)2.576 E F0 .076
-(can be e)2.576 F .076(victed from the pool.)-.25 F F1(Pgaddr)5.076 E F0
-(must be an address pre)108 410.4 Q(viously returned by)-.25 E F1(mpool_g)2.5 E
-(et)-.1 E F0(.).68 E(The \215ag v)108 427.2 Q(alue is speci\214ed by)-.25 E F1
-(or)2.5 E F0('ing an).73 E 2.5(yo)-.15 G 2.5(ft)277.2 427.2 S(he follo)285.81
-427.2 Q(wing v)-.25 E(alues:)-.25 E(MPOOL_DIR)108 444 Q(TY)-.6 E .052(The page\
- has been modi\214ed and must be written to the source \214le before being e)
-133 456 R .052(victed from the pool.)-.25 F(MPOOL_DISCARD)108 472.8 Q .145
-(The page is unlik)133 484.8 R .144(ely to be useful in the near future, and s\
-hould be discarded before other pages in the)-.1 F(pool.)133 496.8 Q
-(The function)108 513.6 Q F1(mpool_put)2.5 E F0(returns -1 on f)2.5 E
-(ailure, setting)-.1 E F1(errno)2.5 E F0 2.5(,a).18 G(nd 0 on success.)352.77
-513.6 Q .027(The function)108 530.4 R F1(mpool_sync)2.527 E F0 .028
-(writes all pages associated with the MPOOLFILE pointer)2.528 F F1(mpf)2.528 E
-F0 2.528(,w)1.96 G .028(hich were speci-)474.414 530.4 R .431(\214ed as ar)108
-542.4 R .431(guments to the)-.18 F F1(mpool_put)2.931 E F0 .431
-(function with an associated \215ag of MPOOL_DIR)2.931 F(TY)-.6 E 2.93(,t)-1.29
-G 2.93(ot)472.61 542.4 S .43(he source \214le.)483.32 542.4 R(The function)108
-554.4 Q F1(mpool_sync)2.5 E F0(returns -1 on f)2.5 E(ailure, setting)-.1 E F1
-(errno)2.5 E F0 2.5(,a).18 G(nd 0 on success.)357.76 554.4 Q 1.075
-(The function)108 571.2 R F1(mpool_unlink)3.575 E F0(destro)3.575 E 1.075
-(ys the memory pool identi\214ed by the directory)-.1 F F1(path)3.575 E F0
-3.575(,r).28 G(emo)471.33 571.2 Q 1.075(ving all \214les)-.15 F 1.121
-(used to implement the memory pool.)108 583.2 R 1.121(\(The directory)6.121 F
-F1(path)3.621 E F0 1.121(is not remo)3.621 F -.15(ve)-.15 G 3.62(d.\) If).15 F
-1.12(there are processes which)3.62 F(ha)108 595.2 Q .871 -.15(ve c)-.2 H
-(alled).15 E F1(mpool_open)3.071 E F0 .571(without calling)3.071 F F1
-(mpool_close)3.071 E F0 .572
-(\(i.e., there are processes currently using the memory)3.071 F(pool\),)108
-607.2 Q F1(mpool_unlink)2.652 E F0 .152(will f)2.652 F .151
-(ail without further action, unless the force \215ag is set, in which case)-.1
-F F1(mpool_unlink)2.651 E F0 .524
-(will attempt to delete the memory pool \214les re)108 619.2 R -.05(ga)-.15 G
-.525(rdless of an).05 F 3.025(yp)-.15 G .525
-(rocesses still using the memory pool.)366.45 619.2 R(An)5.525 E(y)-.15 E .598
-(accesses to a remo)108 631.2 R -.15(ve)-.15 G 3.097(dm).15 G .597
-(emory pool will lik)208.95 631.2 R .597(ely result in une)-.1 F .597
-(xpected beha)-.15 F(vior)-.2 E 5.597(.T)-.55 G .597(he function)436.036 631.2
-R F1(mpool_unlink)3.097 E F0(returns -1 on f)108 643.2 Q(ailure, setting)-.1 E
-F1(errno)2.5 E F0 2.5(,a).18 G(nd 0 on success.)253.61 643.2 Q .11
-(In the case of catastrophic or system f)108 660 R .11
-(ailure, it is possible to clean up a memory pool by remo)-.1 F .11
-(ving all of the)-.15 F .569(\214les in the directory speci\214ed to the)108
-672 R F1(mpool_cr)3.068 E(eate)-.37 E F0 .568
-(function, as memory pool \214les are ne)3.068 F -.15(ve)-.25 G 3.068(rc).15 G
-.568(reated in an)487.364 672 R(y)-.15 E
-(directory other than the one speci\214ed to)108 684 Q F1(mpool_cr)2.5 E(eate)
--.37 E F0(.).18 E(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q
-99.315(ution August)-.2 F(1, 1995)2.5 E(3)535 732 Q EP
-%%Page: 4 16
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 110.12(DB_MPOOL\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 110.12(anual DB_MPOOL\(3\))340.17 48 R .025(The function)108 84 R/F1
-10/Times-Italic@0 SF(mpool_stat)2.525 E F0 .026
-(writes statistics for the memory pool)2.526 F F1(mp)2.526 E F0 .026
-(to the \214le speci\214ed by)2.526 F F1(fp)2.526 E F0 5.026(.T).19 G .026
-(hese statistics)485.254 84 R .829
-(include the number of \214les participating in the pool, the acti)108 96 R
-1.129 -.15(ve p)-.25 H .829(ages in the pool, and numbers as to ho).15 F(w)-.25
-E(ef)108 108 Q(fecti)-.25 E .3 -.15(ve t)-.25 H(he cache has been.).15 E/F2 9
-/Times-Bold@0 SF(ERR)72 124.8 Q(ORS)-.27 E F0(The)108 136.8 Q F1(mpool_cr)3.852
-E(eate)-.37 E F0(,).18 E F1(mpool_open)3.852 E F0(and)3.852 E F1(mpool_fopen)
-3.852 E F0 1.353(functions may f)3.852 F 1.353(ail and set)-.1 F F1(errno)3.853
-E F0 1.353(for an)3.853 F 3.853(yo)-.15 G 3.853(ft)493.424 136.8 S 1.353
-(he errors)503.387 136.8 R(speci\214ed for the library functions)108 148.8 Q F1
-(open)2.5 E F0(\(2\),).24 E F1 -.37(re)2.5 G(ad).37 E F0(\(2\), and).77 E F1
-(malloc)2.5 E F0(\(3\).).31 E(The)108 165.6 Q F1(mpool_close)3.144 E F0(and)
-3.144 E F1(mpool_fclose)3.144 E F0 .644(functions may f)3.144 F .644
-(ail and set)-.1 F F1(errno)3.144 E F0 .643(for an)3.143 F 3.143(yo)-.15 G
-3.143(ft)425.985 165.6 S .643(he errors speci\214ed for the)435.238 165.6 R
-(library functions)108 177.6 Q F1(close)2.5 E F0(\(2\) and).18 E F1(fr)2.5 E
-(ee)-.37 E F0(\(3\).).18 E(The)108 194.4 Q F1(mpool_g)4.097 E(et)-.1 E F0 1.597
-(function may f)4.097 F 1.597(ail and set)-.1 F F1(errno)4.097 E F0 1.597
-(for an)4.097 F 4.097(yo)-.15 G 4.097(ft)349.14 194.4 S 1.597
-(he errors speci\214ed for the library functions)359.347 194.4 R F1 -.37(re)108
-206.4 S(ad).37 E F0(\(2\),).77 E F1(write)2.5 E F0(\(2\), and).18 E F1(malloc)
-2.5 E F0(\(3\) or the follo).31 E(wing:)-.25 E([EINV)108 223.2 Q(AL])-1.35 E
-(The requested page does not e)133 235.2 Q(xist and MPOOL_CREA)-.15 E(TE w)
--1.11 E(as not set.)-.1 E(The)108 252 Q F1(mpool_put)4.288 E F0 1.787
-(function may f)4.287 F 1.787(ail and set)-.1 F F1(errno)4.287 E F0 1.787
-(for an)4.287 F 4.287(yo)-.15 G 4.287(ft)351.701 252 S 1.787
-(he errors speci\214ed for the library function)362.098 252 R F1(write)108 264
-Q F0(\(2\) or the follo).18 E(wing:)-.25 E([EA)108 280.8 Q(CCES])-.4 E
-(The source \214le w)133 292.8 Q(as not opened for writing.)-.1 E(The)108 309.6
-Q F1(mpool_sync)3.993 E F0 1.493(function may f)3.993 F 1.493(ail and set)-.1 F
-F1(errno)3.993 E F0 1.494(for an)3.993 F 3.994(yo)-.15 G 3.994(ft)353.752 309.6
-S 1.494(he errors speci\214ed for the library function)363.856 309.6 R F1
-(write)108 321.6 Q F0(\(2\).).18 E(The)108 338.4 Q F1(mpool_unlink)3.569 E F0
-1.069(function may f)3.569 F 1.068(ail and set)-.1 F F1(errno)3.568 E F0 1.068
-(for an)3.568 F 3.568(yo)-.15 G 3.568(ft)356.734 338.4 S 1.068
-(he errors speci\214ed for the library function)366.412 338.4 R F1(unlink)108
-350.4 Q F0(\(2\) or the follo).67 E(wing:)-.25 E([EB)108 367.2 Q(USY])-.1 E
-(The memory pool w)133 379.2 Q(as in use and the force \215ag w)-.1 E
-(as not set.)-.1 E F2(SEE ALSO)72 396 Q F1(db_btr)108 408 Q(ee)-.37 E F0
-(\(3\),).18 E F1(db_hash)2.5 E F0(\(3\),).28 E F1(db_loc)2.5 E(k)-.2 E F0
-(\(3\),).67 E F1(db_lo)2.5 E(g)-.1 E F0(\(3\),).22 E F1(db_open)2.5 E F0
-(\(3\),).24 E F1(db_r)2.5 E(ecno)-.37 E F0(\(3\),).18 E F1(db_txn)2.5 E F0
-(\(3\)).24 E(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q
-99.315(ution August)-.2 F(1, 1995)2.5 E(4)535 732 Q EP
-%%Page: 1 17
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 119.01(DB_OPEN\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 119.01(anual DB_OPEN\(3\))340.17 48 R/F1 9/Times-Bold@0 SF -.18(NA)
-72 84 S(ME).18 E F0(db_open \255 database access methods)108 96 Q F1(SYNOPSIS)
-72 112.8 Q/F2 10/Times-Bold@0 SF(#include <db)108 124.8 Q(.h>)-.4 E(DB *)108
-148.8 Q(db_open\(const char *\214le, int \215ags, int mode,)108 160.8 Q
-(DBTYPE type, DBINFO *dbinf)158 172.8 Q(o, const v)-.25 E(oid *openinf)-.1 E
-(o\);)-.25 E F1(DESCRIPTION)72 189.6 Q F0 .485(The DB library is a f)108 201.6
-R .485(amily of groups of functions that pro)-.1 F .486
-(vides a modular programming interf)-.15 F .486(ace to trans-)-.1 F .823
-(actions and record-oriented \214le access.)108 213.6 R .822
-(The library includes support for transaction, locking, logging and)5.822 F
-.258(\214le b)108 225.6 R(uf)-.2 E .258(fering functionality)-.25 F 2.758(,a)
--.65 G 2.758(sw)223.214 225.6 S .258(ell as v)237.082 225.6 R .258(arious inde)
--.25 F -.15(xe)-.15 G 2.758(da).15 G .258(ccess methods.)331.434 225.6 R(Man)
-5.258 E 2.758(yo)-.15 G 2.758(ft)427.878 225.6 S .258
-(he functional groups \(e.g.)436.746 225.6 R .528(the memory pool functions\) \
-are useful independently of the rest of the DB functions, although some func-)
-108 237.6 R .306(tional groups are e)108 249.6 R .306
-(xplicitly based on other functional groups \(e.g.)-.15 F .306
-(transactions and logging\).)5.306 F -.15(Fo)5.306 G 2.806(rag).15 G(eneral)
-515.57 249.6 Q .245(description of transactions, see)108 261.6 R/F3 10
-/Times-Italic@0 SF(db_txn)2.745 E F0 2.745(\(3\). F).24 F .245
-(or a general description of the access methods, see)-.15 F F3(db_open)2.745 E
-F0(\(3\)).24 E .307(and then the indi)108 273.6 R .307
-(vidual access method manual pages:)-.25 F F3(db_btr)2.808 E(ee)-.37 E F0
-(\(3\),).18 E F3(db_hash)2.808 E F0(\(3\),).28 E F3(db_lo)2.808 E(g)-.1 E F0
-.308(\(3\) and).22 F F3(db_r)2.808 E(ecno)-.37 E F0(\(3\).).18 E -.15(Fo)108
-285.6 S 3.635(rag).15 G 1.135(eneral description of the lock manager)138.45
-285.6 R 3.635(,s)-.4 G(ee)307.32 285.6 Q F3(db_loc)3.635 E(k)-.2 E F0 3.635
-(\(3\). F).67 F 1.135(or a general description of the memory)-.15 F
-(pool manager)108 297.6 Q 2.5(,s)-.4 G(ee)171.2 297.6 Q F3(db_mpool)2.5 E F0
-(\(3\).).51 E(This manual page describes the o)108 314.4 Q -.15(ve)-.15 G
-(rall structure of the a).15 E -.25(va)-.2 G(ilable access methods.).25 E .457
-(The currently supported \214le formats are btree, hashed, log and recno \(i.e\
-. \215at-\214le oriented\).)108 331.2 R .457(The btree for)5.457 F(-)-.2 E .974
-(mat is a representation of a sorted, balanced tree structure.)108 343.2 R .973
-(The hashed format is an e)5.974 F .973(xtensible, dynamic)-.15 F .801
-(hashing scheme.)108 355.2 R .802
-(The log format is a general-purpose logging f)5.801 F(acility)-.1 E 5.802(.T)
--.65 G .802(he recno format is a byte stream)406.888 355.2 R .415
-(\214le with \214x)108 367.2 R .415(ed or v)-.15 F .415
-(ariable length records.)-.25 F .415(The formats and other)5.415 F 2.914(,f)-.4
-G .414(ormat speci\214c information are described)376.714 367.2 R
-(in detail in their respecti)108 379.2 Q .3 -.15(ve m)-.25 H(anual pages:).15 E
-F3(db_btr)2.5 E(ee)-.37 E F0(\(3\),).18 E F3(db_hash)2.5 E F0(\(3\),).28 E F3
-(db_lo)2.5 E(g)-.1 E F0(\(3\), and).22 E F3(db_r)2.5 E(ecno)-.37 E F0(\(3\).)
-.18 E .138(Db_open opens)108 396 R F3(\214le)2.638 E F0 .139
-(for reading and/or writing.)2.638 F .139(Files ne)5.139 F -.15(ve)-.25 G 2.639
-(ri).15 G .139(ntended to be preserv)349.088 396 R .139
-(ed on disk may be created)-.15 F .423
-(by setting the \214le parameter to NULL.)108 408 R .423
-(\(Note, while most of the access methods use)5.423 F F3(\214le)2.923 E F0 .423
-(as the name of an)2.923 F .429
-(underlying \214le on disk, this is not guaranteed.)108 420 R .43
-(See the manual pages for the indi)5.429 F .43(vidual access methods for)-.25 F
-(more information.\))108 432 Q(The)108 448.8 Q F3<8d61>4.328 E(gs)-.1 E F0(and)
-4.328 E F3 1.828(mode ar)4.328 F(guments)-.37 E F0 1.828
-(are as speci\214ed to the)4.328 F F3(open)4.328 E F0 1.828(\(2\) function, ho)
-.24 F(we)-.25 E -.15(ve)-.25 G 2.628 -.4(r, o).15 H 1.828(nly the O_CREA).4 F
--.74(T,)-1.11 G .127(O_EXCL, O_EXLOCK, O_NONBLOCK, O_RDONL)108 460.8 R 2.708
--1.29(Y, O)-1 H(_RD)1.29 E .128(WR, O_SHLOCK and O_TR)-.3 F .128
-(UNC \215ags are)-.4 F 2.5(meaningful. \(Note,)108 472.8 R
-(opening a database \214le O_WR)2.5 E(ONL)-.4 E 2.5(Yi)-1 G 2.5(sn)342.67 472.8
-S(ot possible.\))354.06 472.8 Q(The)108 489.6 Q F3(type)5.338 E F0(ar)5.338 E
-2.837(gument is of type DBTYPE \(as de\214ned in the <db)-.18 F 2.837
-(.h> include \214le\) and may be set to)-.4 F
-(DB_BTREE, DB_HASH, DB_LOG or DB_RECNO.)108 501.6 Q(The)108 518.4 Q F3(dbinfo)
-3.279 E F0(ar)3.279 E .779(gument is a pointer to a structure containing refer\
-ences to locking, logging, transaction, and)-.18 F 1.242(shared-memory b)108
-530.4 R(uf)-.2 E 1.242(fer pool information.)-.25 F(If)6.242 E F3(dbinfo)3.742
-E F0 1.241(is NULL, then the access method may still use these)3.741 F .667
-(subsystems, b)108 542.4 R .667(ut the usage will be pri)-.2 F -.25(va)-.25 G
-.668(te to the application and managed by DB.).25 F(If)5.668 E F3(dbinfo)3.168
-E F0 .668(is non-NULL,)3.168 F .481(then the module referenced by each of the \
-non-NULL \214elds is used by DB as necessary)108 554.4 R 5.48(.T)-.65 G .48
-(he \214elds of the)479.4 554.4 R(DBINFO structure are de\214ned as follo)108
-566.4 Q(ws:)-.25 E(const char *errpfx;)108 583.2 Q 2.5(Ap)133 595.2 S
-(re\214x to prepend to error messages; used only if)147.72 595.2 Q F3
-(err\214le)2.5 E F0(is non-NULL.)2.5 E(FILE *err\214le;)108 612 Q(The)133 624 Q
-F3(stdio)2.5 E F0(\(3\) \214le stream to which error messages are logged.).18 E
-.147(When an)133 648 R 2.647(ye)-.15 G .147(rror occurs in the)180.904 648 R F3
-(db_open)2.648 E F0 .148(function, or in an)2.648 F 2.648(yf)-.15 G .148
-(unction called using a \214eld of the returned)369.824 648 R .234
-(DB structure, an error v)133 660 R .234
-(alue is returned by the function, and the global v)-.25 F(ariable)-.25 E F3
-(errno)2.733 E F0 .233(is set appropri-)2.733 F(ately)133 672 Q 5.415(.I)-.65 G
-2.915(ns)163.035 672 S .416(ome cases, ho)174.84 672 R(we)-.25 E -.15(ve)-.25 G
-1.216 -.4(r, t).15 H(he).4 E F3(errno)2.916 E F0 -.25(va)2.916 G .416
-(lue may be insuf).25 F .416(\214cient to describe the cause of the error)-.25
-F(.)-.55 E .137(In these cases, if)133 684 R F3(err\214le)2.637 E F0 .137(is n\
-on-NULL, additional error information will be written to the \214le stream it)
-2.637 F(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q 99.315
-(ution August)-.2 F(1, 1995)2.5 E(1)535 732 Q EP
-%%Page: 2 18
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 119.01(DB_OPEN\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 119.01(anual DB_OPEN\(3\))340.17 48 R .643
-(represents, preceded by the string, if an)133 84 R 1.943 -.65(y, s)-.15 H .643
-(peci\214ed by).65 F/F1 10/Times-Italic@0 SF(errpfx)3.143 E F0 5.643(.T).53 G
-.644(his error logging f)394.94 84 R .644(acility should not)-.1 F
-(be required for normal operation, b)133 96 Q(ut may be useful in deb)-.2 E
-(ugging applications.)-.2 E(char *errb)108 112.8 Q(uf;)-.2 E .03(The b)133
-124.8 R(uf)-.2 E .03(fer to which error messages are copied.)-.25 F .029
-(If non-NULL,)5.029 F F1(errb)2.529 E(uf)-.2 E F0(beha)2.529 E -.15(ve)-.2 G
-2.529(sa).15 G 2.529(sd)451.423 124.8 S .029(escribed for)462.842 124.8 R F1
-(err\214le)2.529 E F0(,).18 E -.15(ex)133 136.8 S .173(cept that the).15 F F1
-(errpfx)2.673 E F0 .174
-(\214eld is ignored and the error message is copied into the speci\214ed b)
-2.673 F(uf)-.2 E .174(fer instead)-.25 F 1.014
-(of being written to the FILE stream.)133 148.8 R 1.013
-(The DB routines assume that the associated b)6.014 F(uf)-.2 E 1.013
-(fer is at least)-.25 F(1024 bytes in length.)133 160.8 Q(LOCK_T)108 177.6 Q
-(ABLE_T *lockinfo;)-.93 E .265
-(If locking is required for the \214le being opened \(as in the case of b)133
-189.6 R(uf)-.2 E .266(fers being maintained in a shared)-.25 F 1.794(memory b)
-133 201.6 R(uf)-.2 E 1.794(fer pool\), the)-.25 F F1(loc)4.294 E(kinfo)-.2 E F0
-1.794(\214eld contains a return v)4.294 F 1.793(alue from the function)-.25 F
-F1(loc)4.293 E(k_open)-.2 E F0(that)4.293 E(should be used \(see)133 213.6 Q F1
-(db_loc)2.5 E(k)-.2 E F0 2.5(\(3\)\). If).67 F F1(loc)2.5 E(kinfo)-.2 E F0
-(is NULL, no locking is done.)2.5 E(DB *loginfo;)108 230.4 Q .93
-(If modi\214cations to the \214le being opened should be logged, the)133 242.4
-R F1(lo)3.43 E(ginfo)-.1 E F0 .93(\214eld contains a return v)3.43 F(alue)-.25
-E .063(from the function)133 254.4 R F1(dbopen)2.563 E F0 2.563(,w).24 G .062
-(hen opening a DB \214le of type DB_LOG.)247.642 254.4 R(If)5.062 E F1(lo)2.562
-E(ginfo)-.1 E F0 .062(is NULL, no logging)2.562 F(is done.)133 266.4 Q
-(MPOOL *mpoolinfo;)108 283.2 Q 1.129
-(If the cache for the \214le being opened should be maintained in a shared b)
-133 295.2 R(uf)-.2 E 1.129(fer pool, the)-.25 F F1(mpoolinfo)3.629 E F0 .102
-(\214eld contains a return v)133 307.2 R .102(alue from the function)-.25 F F1
-(mpool_open)2.602 E F0 .102(that should be used \(see)2.602 F F1(db_mpool)2.602
-E F0 2.602(\(3\)\). If).51 F F1(mpoolinfo)133 319.2 Q F0 .429
-(is NULL, a memory pool may still be created, b)2.929 F .43(ut it will be pri)
--.2 F -.25(va)-.25 G .43(te to the application and).25 F(managed by DB.)133
-331.2 Q(TXNMGR *txninfo;)108 348 Q 1.161
-(If the accesses to the \214le being opened should tak)133 360 R 3.661(ep)-.1 G
-1.161(lace in the conte)354.474 360 R 1.161(xt of transactions \(pro)-.15 F
-(viding)-.15 E 1.239(atomicity and complete error reco)133 372 R -.15(ve)-.15 G
-1.239(ry\), the).15 F F1(txninfo)3.739 E F0 1.239(\214eld contains a return v)
-3.739 F 1.24(alue from the function)-.25 F F1(txn_open)133 384 Q F0(\(see)2.599
-E F1(db_txn)2.599 E F0 2.599(\(3\)\). If).24 F .098
-(transactions are speci\214ed, the application is responsible for making suit-)
-2.599 F 1.27(able calls to)133 396 R F1(txn_be)3.77 E(gin)-.4 E F0(,).24 E F1
-(txn_abort)3.77 E F0 3.77(,a).68 G(nd)282.91 396 Q F1(txn_commit)3.77 E F0 6.27
-(.I).68 G(f)356.12 396 Q F1(txninfo)3.77 E F0 1.27
-(is NULL, no transaction support is)3.77 F(done.)133 408 Q(The)108 424.8 Q F1
-(openinfo)2.85 E F0(ar)2.85 E .349(gument is a pointer to an access method spe\
-ci\214c structure described in the access method')-.18 F(s)-.55 E .03
-(manual page.)108 436.8 R(If)5.03 E F1(openinfo)2.53 E F0 .031
-(is NULL, each access method will use def)2.53 F .031
-(aults appropriate for the system and the)-.1 F(access method.)108 448.8 Q/F2 9
-/Times-Bold@0 SF(KEY/D)72 465.6 Q -1.35 -.855(AT A)-.315 H -.666(PA)3.105 G
-(IRS).666 E F0 .313(Access to all access methods is based on k)108 477.6 R -.15
-(ey)-.1 G .312(/data pairs.).15 F .312(Both k)5.312 F -.15(ey)-.1 G 2.812(sa)
-.15 G .312(nd data are represented by the follo)386.758 477.6 R(w-)-.25 E
-(ing data structure:)108 489.6 Q(typedef struct {)108 506.4 Q -.2(vo)144 518.4
-S(id *data;).2 E(size_t size;)144 530.4 Q 2.5(}D)108 542.4 S(BT)122.52 542.4 Q
-(;)-.55 E(The elements of the DBT structure are de\214ned as follo)108 559.2 Q
-(ws:)-.25 E 5.84(data A)108 576 R(pointer to a byte string.)2.5 E 6.95
-(size The)108 592.8 R(length of)2.5 E F1(data)2.5 E F0 2.5(,i).26 G 2.5(nb)
-215.2 592.8 S(ytes.)227.7 592.8 Q -2.15 -.25(Ke y)108 609.6 T .672(and data by\
-te strings may reference strings of essentially unlimited length, although an)
-3.422 F 3.173(yt)-.15 G .873 -.1(wo o)493.204 609.6 T 3.173(ft).1 G(hem)522.78
-609.6 Q(must \214t into a)108 621.6 Q -.25(va)-.2 G
-(ilable memory at the same time.).25 E .14(The access methods pro)108 638.4 R
-.139(vide no guarantees about byte string alignment, and applications are resp\
-onsible for)-.15 F(maintaining an)108 650.4 Q 2.5(yn)-.15 G
-(ecessary alignment.)180.07 650.4 Q F2(DB OPERA)72 667.2 Q(TIONS)-.855 E F1
-(Db_open)108 679.2 Q F0 .56
-(returns a pointer to a DB structure \(as de\214ned in the <db)3.06 F .56
-(.h> include \214le\) on success, and NULL)-.4 F 1.02(on error)108 691.2 R 6.02
-(.T)-.55 G 1.02(he DB structure describes a database type, and includes a set \
-of functions to perform v)155.03 691.2 R(arious)-.25 E(4.4 Berk)72 732 Q(ele)
--.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q 99.315(ution August)-.2 F(1, 1995)2.5 E
-(2)535 732 Q EP
-%%Page: 3 19
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 119.01(DB_OPEN\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 119.01(anual DB_OPEN\(3\))340.17 48 R .241
-(actions, as described belo)108 84 R 4.041 -.65(w. E)-.25 H .241
-(ach of these functions tak).65 F .241
-(es a pointer to a DB structure, and may tak)-.1 F 2.741(eo)-.1 G .242(ne or)
-519.488 84 R .889(more DBT *')108 96 R 3.389(sa)-.55 G .889(nd a \215ag v)
-174.827 96 R .889(alue as well.)-.25 F(Indi)5.889 E .888
-(vidual access methods specify additional functions and \215ags)-.25 F
-(which are speci\214c to the method.)108 108 Q
-(The \214elds of the DB structure are as follo)5 E(ws:)-.25 E(DBTYPE type;)108
-124.8 Q(The type of the underlying access method \(and \214le format\).)133
-136.8 Q(int \(*close\)\(const DB *db\);)108 153.6 Q 3.863(Ap)133 165.6 S 1.363
-(ointer to a function to \215ush an)149.083 165.6 R 3.864(yc)-.15 G 1.364
-(ached information to disk, free an)290.968 165.6 R 3.864(ya)-.15 G 1.364
-(llocated resources, and)445.912 165.6 R .878(close an)133 177.6 R 3.378(yu)
--.15 G .878(nderlying \214les.)179.596 177.6 R .878(Since k)5.878 F -.15(ey)-.1
-G .878(/data pairs are cached in memory).15 F 3.377(,f)-.65 G .877
-(ailing to sync the \214le with)431.445 177.6 R(the)133 189.6 Q/F1 10
-/Times-Italic@0 SF(close)2.5 E F0(or)2.5 E F1(sync)2.5 E F0
-(function may result in inconsistent or lost information.)2.5 E(The)133 206.4 Q
-F1(close)2.5 E F0(functions return -1 on f)2.5 E(ailure, setting)-.1 E F1
-(errno)2.5 E F0 2.5(,a).18 G(nd 0 on success.)355.54 206.4 Q
-(int \(*del\)\(const DB *db, TXN *txnid,)108 223.2 Q(const DBT *k)183 235.2 Q
--.15(ey)-.1 G 2.5(,u)-.5 G(_int \215ags\);)257.65 235.2 Q 2.541(Ap)133 247.2 S
-.041(ointer to a function to remo)147.761 247.2 R .341 -.15(ve k)-.15 H -.15
-(ey).05 G .041(/data pairs from the database.).15 F .042(The k)5.041 F -.15(ey)
--.1 G .042(/data pair associated with).15 F(the speci\214ed)133 259.2 Q F1 -.1
-(ke)2.5 G(y)-.2 E F0(are discarded from the database.)2.5 E(The)133 276 Q F1
-(txnid)3.317 E F0 .817(parameter contains a transaction ID returned from)3.317
-F F1(txn_be)3.317 E(gin)-.4 E F0 3.317(,i).24 G 3.316(ft)431.22 276 S .816
-(he \214le is being accessed)440.646 276 R
-(under transaction protection, or NULL if transactions are not in ef)133 288 Q
-(fect.)-.25 E(The parameter)133 304.8 Q F1<8d61>2.5 E(g)-.1 E F0
-(must be set to 0 or e)2.5 E(xactly one of the follo)-.15 E(wing v)-.25 E
-(alues:)-.25 E(R_CURSOR)133 321.6 Q(Delete the record referenced by the cursor)
-158 333.6 Q 5(.T)-.55 G(he cursor must ha)339.32 333.6 Q .3 -.15(ve p)-.2 H(re)
-.15 E(viously been initialized.)-.25 E(The)133 350.4 Q F1(delete)2.934 E F0
-.434(functions return -1 on error)2.934 F 2.934(,s)-.4 G(etting)297.818 350.4 Q
-F1(errno)2.934 E F0 2.934(,0o).18 G 2.934(ns)364.3 350.4 S .434
-(uccess, and 1 if the speci\214ed)376.124 350.4 R F1 -.1(ke)2.935 G(y)-.2 E F0
-.435(did not)2.935 F -.15(ex)133 362.4 S(ist in the \214le.).15 E
-(int \(*fd\)\(const DB *db\);)108 379.2 Q 3.351(Ap)133 391.2 S .851
-(ointer to a function which returns a \214le descriptor representati)148.571
-391.2 R 1.15 -.15(ve o)-.25 H 3.35(ft).15 G .85(he underlying database.)430.53
-391.2 R(A)5.85 E .338(\214le descriptor referencing the same \214le will be re\
-turned to all processes which call)133 403.2 R F1(db_open)2.838 E F0 .339
-(with the)2.839 F(same)133 415.2 Q F1(\214le)3.376 E F0 3.376(name. This)3.376
-F .876(\214le descriptor may be safely used as an ar)3.376 F .876
-(gument to the)-.18 F F1(fcntl)3.376 E F0 .875(\(2\) and).51 F F1(\215oc)3.375
-E(k)-.2 E F0(\(2\)).67 E .99(locking functions.)133 427.2 R .99
-(The \214le descriptor is not necessarily associated with an)5.99 F 3.49(yo)
--.15 G 3.49(ft)453.98 427.2 S .99(he underlying \214les)463.58 427.2 R
-(used by the access method.)133 439.2 Q(No \214le descriptor is a)5 E -.25(va)
--.2 G(ilable for in memory databases.).25 E(The)133 456 Q F1(fd)2.5 E F0
-(functions return -1 on error)2.5 E 2.5(,s)-.4 G(etting)278.68 456 Q F1(errno)
-2.5 E F0 2.5(,a).18 G(nd the \214le descriptor on success.)335.8 456 Q
-(int \(*get\)\(const DB *db, TXN *txnid,)108 472.8 Q(const DBT *k)183 484.8 Q
--.15(ey)-.1 G 2.5(,D)-.5 G(BT *data, u_int \215ags\);)259.87 484.8 Q 2.854(Ap)
-133 496.8 S .354(ointer to a function which is the interf)148.074 496.8 R .354
-(ace for k)-.1 F -.15(ey)-.1 G .353(ed retrie).15 F -.25(va)-.25 G 2.853(lf).25
-G .353(rom the database.)397.995 496.8 R .353(The address and)5.353 F
-(length of the data associated with the speci\214ed)133 508.8 Q F1 -.1(ke)2.5 G
-(y)-.2 E F0(are returned in the structure referenced by)2.5 E F1(data)2.5 E F0
-(.).26 E(The)133 525.6 Q F1(txnid)3.316 E F0 .816
-(parameter contains a transaction ID returned from)3.316 F F1(txn_be)3.317 E
-(gin)-.4 E F0 3.317(,i).24 G 3.317(ft)431.215 525.6 S .817
-(he \214le is being accessed)440.642 525.6 R
-(under transaction protection, or NULL if transactions are not in ef)133 537.6
-Q(fect.)-.25 E(The)133 554.4 Q F1 -.1(ge)2.5 G(t).1 E F0
-(functions return -1 on error)2.5 E 2.5(,s)-.4 G(etting)283.02 554.4 Q F1
-(errno)2.5 E F0 2.5(,0o).18 G 2.5(ns)348.2 554.4 S(uccess, and 1 if the)359.59
-554.4 Q F1 -.1(ke)2.5 G(y)-.2 E F0 -.1(wa)2.5 G 2.5(sn).1 G(ot found.)476.83
-554.4 Q(int \(*put\)\(const DB *db, TXN *txnid,)108 571.2 Q(DBT *k)183 583.2 Q
--.15(ey)-.1 G 2.5(,c)-.5 G(onst DBT *data, u_int \215ags\);)233.48 583.2 Q 2.5
-(Ap)133 595.2 S(ointer to a function to store k)147.72 595.2 Q -.15(ey)-.1 G
-(/data pairs in the database.).15 E(The)133 612 Q F1(txnid)3.317 E F0 .817
-(parameter contains a transaction ID returned from)3.317 F F1(txn_be)3.317 E
-(gin)-.4 E F0 3.317(,i).24 G 3.316(ft)431.22 612 S .816
-(he \214le is being accessed)440.646 612 R
-(under transaction protection, or NULL if transactions are not in ef)133 624 Q
-(fect.)-.25 E(The parameter)133 640.8 Q F1<8d61>2.5 E(g)-.1 E F0
-(must be set to 0 or e)2.5 E(xactly one of the follo)-.15 E(wing v)-.25 E
-(alues:)-.25 E(R_CURSOR)133 657.6 Q .448(Replace the k)158 669.6 R -.15(ey)-.1
-G .448(/data pair referenced by the cursor).15 F 5.449(.T)-.55 G .449
-(he cursor must ha)375.156 669.6 R .749 -.15(ve p)-.2 H(re).15 E .449
-(viously been ini-)-.25 F(tialized.)158 681.6 Q(4.4 Berk)72 732 Q(ele)-.1 E 2.5
-(yD)-.15 G(istrib)132.57 732 Q 99.315(ution August)-.2 F(1, 1995)2.5 E(3)535
-732 Q EP
-%%Page: 4 20
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 119.01(DB_OPEN\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 119.01(anual DB_OPEN\(3\))340.17 48 R(R_NOO)133 84 Q(VER)-.5 E
-(WRITE)-.55 E(Enter the ne)158 96 Q 2.5(wk)-.25 G -.15(ey)220.69 96 S
-(/data pair only if the k).15 E .3 -.15(ey d)-.1 H(oes not pre).15 E(viously e)
--.25 E(xist.)-.15 E .664(The def)133 112.8 R .664(ault beha)-.1 F .664
-(vior of the)-.2 F/F1 10/Times-Italic@0 SF(put)3.164 E F0 .664
-(functions is to enter the ne)3.164 F 3.164(wk)-.25 G -.15(ey)387.498 112.8 S
-.663(/data pair).15 F 3.163(,r)-.4 G .663(eplacing an)443.534 112.8 R 3.163(yp)
--.15 G(re)503.03 112.8 Q(viously)-.25 E -.15(ex)133 124.8 S(isting k).15 E -.15
-(ey)-.1 G(.)-.5 E(The)133 141.6 Q F1(put)3.558 E F0 1.058
-(functions return -1 on error)3.558 F 3.559(,s)-.4 G(etting)291.089 141.6 Q F1
-(errno)3.559 E F0 3.559(,0o).18 G 3.559(ns)359.446 141.6 S 1.059
-(uccess, and 1 if the R_NOO)371.895 141.6 R(VER)-.5 E(WRITE)-.55 E F1<8d61>133
-153.6 Q(g)-.1 E F0 -.1(wa)2.5 G 2.5(ss).1 G(et and the k)172.24 153.6 Q .3 -.15
-(ey a)-.1 H(lready e).15 E(xists in the \214le.)-.15 E
-(int \(*seq\)\(const DB *db, TXN *txnid,)108 170.4 Q(DBT *k)183 182.4 Q -.15
-(ey)-.1 G 2.5(,D)-.5 G(BT *data, u_int \215ags\);)236.26 182.4 Q 2.877(Ap)133
-194.4 S .377(ointer to a function which is the interf)148.097 194.4 R .377
-(ace for sequential retrie)-.1 F -.25(va)-.25 G 2.877(lf).25 G .377
-(rom the database.)415.194 194.4 R .376(The address)5.376 F .012
-(and length of the k)133 206.4 R .312 -.15(ey a)-.1 H .012
-(re returned in the structure referenced by).15 F F1 -.1(ke)2.512 G(y)-.2 E F0
-2.512(,a).32 G .012(nd the address and length of the)412.726 206.4 R
-(data are returned in the structure referenced by)133 218.4 Q F1(data)2.5 E F0
-(.).26 E(The)133 235.2 Q F1(txnid)3.317 E F0 .817
-(parameter contains a transaction ID returned from)3.317 F F1(txn_be)3.317 E
-(gin)-.4 E F0 3.317(,i).24 G 3.316(ft)431.22 235.2 S .816
-(he \214le is being accessed)440.646 235.2 R
-(under transaction protection, or NULL if transactions are not in ef)133 247.2
-Q(fect.)-.25 E .721(Sequential k)133 264 R -.15(ey)-.1 G .721
-(/data pair retrie).15 F -.25(va)-.25 G 3.221(lm).25 G .721(ay be)277.884 264 R
-.721(gin at an)-.15 F 3.221(yt)-.15 G .721
-(ime, and the logical position of the `)346.568 264 R(`cursor')-.74 E 3.222('i)
--.74 G(s)536.11 264 Q .947(not af)133 276 R .947(fected by calls to the)-.25 F
-F1(del)3.447 E F0(,).51 E F1 -.1(ge)3.447 G(t).1 E F0(,).68 E F1(put)3.447 E F0
-3.446(,o).68 G(r)308.572 276 Q F1(sync)3.446 E F0 3.446
-(functions. Modi\214cations)3.446 F .946(to the database during a)3.446 F 2.091
-(sequential scan will be re\215ected in the scan, i.e. records inserted behind\
- the cursor will not be)133 288 R
-(returned while records inserted in front of the cursor will be returned.)133
-300 Q(The parameter)133 316.8 Q F1<8d61>2.5 E(g)-.1 E F0(must be set to 0 or e)
-2.5 E(xactly one of the follo)-.15 E(wing v)-.25 E(alues:)-.25 E(R_CURSOR)133
-333.6 Q .937(The data associated with the speci\214ed k)158 345.6 R 1.237 -.15
-(ey i)-.1 H 3.437(sr).15 G 3.437(eturned. This)348.546 345.6 R(dif)3.437 E .936
-(fers from the)-.25 F F1 -.1(ge)3.436 G(t).1 E F0 .936(functions in)3.436 F
-(that it sets or initializes the cursor to the location of the k)158 357.6 Q .3
--.15(ey a)-.1 H 2.5(sw).15 G(ell.)415.5 357.6 Q(R_FIRST)133 374.4 Q .835
-(The \214rst k)158 386.4 R -.15(ey)-.1 G .835(/data pair of the database is re\
-turned, and the cursor is set or initialized to refer).15 F(-)-.2 E(ence it.)
-158 398.4 Q(R_NEXT)133 415.2 Q(Retrie)158 427.2 Q 1.015 -.15(ve t)-.25 H .715
-(he k).15 F -.15(ey)-.1 G .715(/data pair immediately after the cursor).15 F
-5.715(.I)-.55 G 3.215(ft)391.91 427.2 S .714
-(he cursor is not yet set, this is the)401.235 427.2 R
-(same as the R_FIRST \215ag.)158 439.2 Q(The)133 456 Q F1(seq)3.014 E F0 .514
-(functions return -1 on error)3.014 F 3.015(,s)-.4 G(etting)287.83 456 Q F1
-(errno)3.015 E F0 3.015(,0o).18 G 3.015(ns)354.555 456 S .515
-(uccess, and 1 if there are no k)366.46 456 R -.15(ey)-.1 G .515(/data pairs)
-.15 F(less than or greater than the speci\214ed or current k)133 468 Q -.15(ey)
--.1 G(.)-.5 E(int \(*sync\)\(const DB *db, u_int \215ags\);)108 484.8 Q 3.291
-(Ap)133 496.8 S .791(ointer to a function to \215ush an)148.511 496.8 R 3.291
-(yc)-.15 G .791(ached information to disk.)286.388 496.8 R .79
-(If the database is in memory only)5.79 F(,)-.65 E(the)133 508.8 Q F1(sync)2.5
-E F0(function has no ef)2.5 E(fect and will al)-.25 E -.1(wa)-.1 G(ys succeed.)
-.1 E(The parameter)133 525.6 Q F1<8d61>2.5 E(g)-.1 E F0
-(must be set to 0 or a v)2.5 E
-(alue speci\214ed by an access method speci\214c manual page.)-.25 E(The)133
-542.4 Q F1(sync)2.5 E F0(functions return -1 on f)2.5 E(ailure, setting)-.1 E
-F1(errno)2.5 E F0 2.5(,a).18 G(nd 0 on success.)352.76 542.4 Q/F2 9
-/Times-Bold@0 SF(ERR)72 559.2 Q(ORS)-.27 E F0(The)108 571.2 Q F1(db_open)4.548
-E F0 2.048(function may f)4.548 F 2.049(ail and set)-.1 F F1(errno)4.549 E F0
-2.049(for an)4.549 F 4.549(yo)-.15 G 4.549(ft)345.977 571.2 S 2.049
-(he errors speci\214ed for the library functions)356.636 571.2 R F1(open)108
-583.2 Q F0(\(2\),).24 E F1(malloc)2.5 E F0(\(3\) or the follo).31 E(wing:)-.25
-E([EFTYPE])108 600 Q 2.5<418c>133 612 S(le is incorrectly formatted.)148.28 612
-Q([EINV)108 628.8 Q(AL])-1.35 E 2.557(Ap)133 640.8 S .056
-(arameter has been speci\214ed \(hash function, recno pad byte etc.\))147.777
-640.8 R .056(that is incompatible with the cur)5.056 F(-)-.2 E .725
-(rent \214le speci\214cation or)133 652.8 R 3.225(,a\215)-.4 G .725
-(ag to a function which is not meaningful for the function \(for e)248.435
-652.8 R(xample,)-.15 E .763(use of the cursor without prior initialization\) o\
-r there is a mismatch between the v)133 664.8 R .763(ersion number of)-.15 F
-(\214le and the softw)133 676.8 Q(are.)-.1 E(The)108 693.6 Q F1(close)2.913 E
-F0 .413(functions may f)2.913 F .413(ail and set)-.1 F F1(errno)2.913 E F0 .413
-(for an)2.913 F 2.913(yo)-.15 G 2.913(ft)319.62 693.6 S .414
-(he errors speci\214ed for the library functions)328.643 693.6 R F1(close)2.914
-E F0(\(2\),).18 E(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q
-99.315(ution August)-.2 F(1, 1995)2.5 E(4)535 732 Q EP
-%%Page: 5 21
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 119.01(DB_OPEN\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 119.01(anual DB_OPEN\(3\))340.17 48 R/F1 10/Times-Italic@0 SF -.37
-(re)108 84 S(ad).37 E F0(\(2\),).77 E F1(write)2.5 E F0(\(2\),).18 E F1(fr)2.5
-E(ee)-.37 E F0(\(3\), or).18 E F1(fsync)2.5 E F0(\(2\).).31 E(The)108 100.8 Q
-F1(del)2.52 E F0(,).51 E F1 -.1(ge)2.52 G(t).1 E F0(,).68 E F1(put)2.52 E F0
-(and)2.52 E F1(seq)2.52 E F0 .02(functions may f)2.52 F .02(ail and set)-.1 F
-F1(errno)2.52 E F0 .02(for an)2.52 F 2.52(yo)-.15 G 2.52(ft)376.3 100.8 S .02
-(he errors speci\214ed for the library func-)384.93 100.8 R(tions)108 112.8 Q
-F1 -.37(re)2.5 G(ad).37 E F0(\(2\),).77 E F1(write)2.5 E F0(\(2\),).18 E F1(fr)
-2.5 E(ee)-.37 E F0(\(3\) or).18 E F1(malloc)2.5 E F0(\(3\).).31 E(The)108 129.6
-Q F1(fd)2.5 E F0(functions will f)2.5 E(ail and set)-.1 E F1(errno)2.5 E F0
-(to ENOENT for in memory databases.)2.5 E(The)108 146.4 Q F1(sync)2.5 E F0
-(functions may f)2.5 E(ail and set)-.1 E F1(errno)2.5 E F0(for an)2.5 E 2.5(yo)
--.15 G 2.5(ft)312.71 146.4 S(he errors speci\214ed for the library function)
-321.32 146.4 Q F1(fsync)2.5 E F0(\(2\).).31 E/F2 9/Times-Bold@0 SF(SEE ALSO)72
-163.2 Q F1(db_btr)108 175.2 Q(ee)-.37 E F0(\(3\),).18 E F1(db_hash)2.5 E F0
-(\(3\),).28 E F1(db_loc)2.5 E(k)-.2 E F0(\(3\),).67 E F1(db_lo)2.5 E(g)-.1 E F0
-(\(3\),).22 E F1(db_mpool)2.5 E F0(\(3\),).51 E F1(db_r)2.5 E(ecno)-.37 E F0
-(\(3\),).18 E F1(db_txn)2.5 E F0(\(3\)).24 E F2 -.09(BU)72 192 S(GS).09 E F0
-.106(The name DBT is a mnemonic for `)108 204 R .106(`data base thang')-.74 F
-.106(', and w)-.74 F .107(as used because noone could think of a reason-)-.1 F
-(able name that w)108 216 Q(asn')-.1 E 2.5(ta)-.18 G(lready in use some)202.14
-216 Q(where else.)-.25 E(The)108 232.8 Q F1(fd)2.5 E F0(function interf)2.5 E
-(ace is a kluge, and will be deleted in a future v)-.1 E(ersion of the interf)
--.15 E(ace.)-.1 E(Only big and little endian byte order is supported.)108 249.6
-Q(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q 99.315
-(ution August)-.2 F(1, 1995)2.5 E(5)535 732 Q EP
-%%Page: 1 22
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 111.23(DB_RECNO\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 111.23(anual DB_RECNO\(3\))340.17 48 R/F1 9/Times-Bold@0 SF -.18(NA)
-72 84 S(ME).18 E F0(db_recno \255 record number database access method)108 96 Q
-F1(DESCRIPTION)72 112.8 Q F0(speci\214c details of the recno access method.)108
-124.8 Q F1 -.495(AC)72 141.6 S(CESS METHOD SPECIFIC INFORMA).495 E(TION)-.855 E
-F0 2.497(The recno access method speci\214c data structure pro)108 153.6 R
-2.497(vided to)-.15 F/F2 10/Times-Italic@0 SF(db_open)4.997 E F0 2.497
-(is typedef)4.997 F 3.497 -.5('d a).55 H 2.497(nd named REC-).5 F 2.765
-(NOINFO. A)108 165.6 R .265(RECNOINFO structure has at least the follo)2.765 F
-.266(wing \214elds, which may be initialized before call-)-.25 F(ing)108 177.6
-Q F2(db_open)2.5 E F0(:).24 E(u_int8_t b)108 194.4 Q -.25(va)-.15 G(l;).25 E
-.793(The delimiting byte to be used to mark the end of a record for v)133 206.4
-R .793(ariable-length records, and the pad)-.25 F .386(character for \214x)133
-218.4 R .387(ed-length records.)-.15 F .387(If no v)5.387 F .387
-(alue is speci\214ed, ne)-.25 F .387(wlines \(`)-.25 F(`\\n')-.74 E .387
-('\) are used to mark the end)-.74 F(of v)133 230.4 Q
-(ariable-length records and \214x)-.25 E
-(ed-length records are padded with spaces.)-.15 E(char *bfname;)108 247.2 Q
-1.152(The recno access method stores the in-memory copies of its records in a \
-btree.)133 259.2 R 1.152(If bfname is non-)6.152 F .35(NULL, it speci\214es th\
-e name of the btree \214le, as if speci\214ed as the \214le name for a)133
-271.2 R F2(db_open)2.851 E F0 .351(of a btree)2.851 F(\214le.)133 283.2 Q
-(u_int cachesize;)108 300 Q 3.847(As)133 312 S 1.347
-(uggested maximum size, in bytes, of the memory cache.)147.957 312 R 1.347
-(This v)6.347 F 1.347(alue is)-.25 F/F3 10/Times-Bold@0 SF(only)3.847 E F0
-(advisory)3.847 E 3.846(,a)-.65 G 1.346(nd the)513.934 312 R .693
-(access method will allocate more memory rather than f)133 324 R 3.193(ail. If)
--.1 F F2(cac)3.193 E(hesize)-.15 E F0 3.193(is 0)3.193 F .693
-(\(no size is speci\214ed\) a)3.193 F(def)133 336 Q(ault size is used.)-.1 E
-(u_long \215ags;)108 352.8 Q(The \215ag v)133 364.8 Q(alue is speci\214ed by)
--.25 E F2(or)2.5 E F0('ing an).73 E 2.5(yo)-.15 G 2.5(ft)302.2 364.8 S
-(he follo)310.81 364.8 Q(wing v)-.25 E(alues:)-.25 E(R_FIXEDLEN)133 381.6 Q
-1.49(The records are \214x)158 393.6 R 1.489(ed-length, not byte delimited.)
--.15 F 1.489(The structure element)6.489 F F2 -.37(re)3.989 G(clen).37 E F0
-1.489(speci\214es the)3.989 F .487
-(length of the record, and the structure element)158 405.6 R F2(bval)2.987 E F0
-.488(is used as the pad character)2.988 F 5.488(.A)-.55 G .788 -.15(ny r)
-495.232 405.6 T(ecords,).15 E(inserted into the database, that are less than)
-158 417.6 Q F2 -.37(re)2.5 G(clen).37 E F0
-(bytes long are automatically padded.)2.5 E(R_NOKEY)133 434.4 Q 1.146
-(In the interf)158 446.4 R 1.146(ace speci\214ed by)-.1 F F2(db_open)3.646 E F0
-3.646(,t).24 G 1.146(he sequential record retrie)320.816 446.4 R -.25(va)-.25 G
-3.646<6c8c>.25 G 1.145(lls in both the caller')449.31 446.4 R(s)-.55 E -.1(ke)
-158 458.4 S 4.795(ya)-.05 G 2.295(nd data structures.)181.425 458.4 R 2.295
-(If the R_NOKEY \215ag is speci\214ed, the)7.295 F F2(cur)4.795 E(sor)-.1 E F0
-2.295(functions are not)4.795 F .621(required to \214ll in the k)158 470.4 R
-.921 -.15(ey s)-.1 H 3.121(tructure. This).15 F .621
-(permits applications to retrie)3.121 F .92 -.15(ve r)-.25 H .62
-(ecords at the end of).15 F(\214les without reading all of the interv)158 482.4
-Q(ening records.)-.15 E(R_SN)133 499.2 Q(APSHO)-.35 E(T)-.4 E .029
-(This \215ag requires that a snapshot of the \214le be tak)158 511.2 R .029
-(en when)-.1 F F2(db_open)2.529 E F0 .029(is called, instead of permit-)2.529 F
-(ting an)158 523.2 Q 2.5(yu)-.15 G
-(nmodi\214ed records to be read from the original \214le.)197.85 523.2 Q
-(int lorder;)108 540 Q .65(The byte order for inte)133 552 R .65
-(gers in the stored database metadata.)-.15 F .65
-(The number should represent the order)5.65 F .748(as an inte)133 564 R .749
-(ger; for e)-.15 F .749(xample, big endian order w)-.15 F .749
-(ould be the number 4,321.)-.1 F(If)5.749 E F2(lor)3.249 E(der)-.37 E F0 .749
-(is 0 \(no order is)3.249 F(speci\214ed\) the current host order is used.)133
-576 Q(u_int psize;)108 592.8 Q .284(The recno access method stores the in-memo\
-ry copies of its records in a btree.)133 604.8 R .284(This v)5.284 F .283
-(alue is the size)-.25 F .297
-(\(in bytes\) of the pages used for nodes in that tree.)133 616.8 R(If)5.297 E
-F2(psize)2.797 E F0 .297(is 0 \(no page size is speci\214ed\) a page size)2.797
-F(is chosen based on the underlying \214le system I/O block size.)133 628.8 Q
-(See)5 E F2(btr)2.5 E(ee)-.37 E F0(\(3\) for more information.).18 E
-(size_t reclen;)108 645.6 Q(The length of a \214x)133 657.6 Q
-(ed-length record.)-.15 E(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)
-132.57 732 Q 99.315(ution August)-.2 F(1, 1995)2.5 E(1)535 732 Q EP
-%%Page: 2 23
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 111.23(DB_RECNO\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 111.23(anual DB_RECNO\(3\))340.17 48 R/F1 9/Times-Bold@0 SF
-(DB OPERA)72 84 Q(TIONS)-.855 E F0 .972(The data part of the k)108 96 R -.15
-(ey)-.1 G .971(/data pair used by the recno access method is the same as other\
- access methods.).15 F .198(The k)108 108 R .498 -.15(ey i)-.1 H 2.698(sd).15 G
-(if)157.504 108 Q 2.698(ferent. The)-.25 F/F2 10/Times-Italic@0 SF(data)2.698 E
-F0 .198(\214eld of the k)2.698 F .499 -.15(ey s)-.1 H .199
-(hould be a pointer to a memory location of type).15 F F2 -.37(re)2.699 G
-(cno_t).37 E F0 2.699(,a).68 G(s)536.11 108 Q .506(de\214ned in the <db)108 120
-R .506(.h> include \214le.)-.4 F .506(This type is normally the lar)5.506 F
-.506(gest unsigned inte)-.18 F .506(gral type a)-.15 F -.25(va)-.2 G .505
-(ilable to the).25 F 2.5(implementation. The)108 132 R F2(size)2.5 E F0
-(\214eld of the k)2.5 E .3 -.15(ey s)-.1 H(hould be the size of that type.).15
-E 1.944(The record number data structure is either v)108 148.8 R 1.944
-(ariable or \214x)-.25 F 1.944
-(ed-length records stored in a \215at-\214le format,)-.15 F 1.856
-(accessed by the logical record number)108 160.8 R 6.856(.T)-.55 G 1.856(he e)
-285.206 160.8 R 1.856(xistence of record number \214v)-.15 F 4.356(er)-.15 G
-1.856(equires the e)440.442 160.8 R 1.856(xistence of)-.15 F .875
-(records one through four)108 172.8 R 3.375(,a)-.4 G .875
-(nd the deletion of record number one causes record number \214v)219.68 172.8 R
-3.376(et)-.15 G 3.376(ob)489.928 172.8 S 3.376(er)503.304 172.8 S(enum-)514.45
-172.8 Q .283(bered to record number four)108 184.8 R 2.783(,a)-.4 G 2.783(sw)
-231.195 184.8 S .283(ell as the cursor)245.088 184.8 R 2.783(,i)-.4 G 2.783(fp)
-316.64 184.8 S .282(ositioned after record number one, to shift do)327.753
-184.8 R .282(wn one)-.25 F 3.18(record. The)108 196.8 R .68
-(creation of record number \214v)3.18 F 3.18(ew)-.15 G .681
-(hen records one through four do not e)295.05 196.8 R .681
-(xist causes the logical)-.15 F(creation of them with zero-length data.)108
-208.8 Q .372(Because there is no meta-data associated with the underlying recn\
-o access method \214les, an)108 225.6 R 2.872(yc)-.15 G .372(hanges made)
-487.698 225.6 R .191(to the def)108 237.6 R .191(ault v)-.1 F .191
-(alues \(e.g. \214x)-.25 F .192(ed record length or byte separator v)-.15 F
-.192(alue\) must be e)-.25 F .192(xplicitly speci\214ed each time)-.15 F
-(the \214le is opened.)108 249.6 Q 1.037(The functions returned by)108 266.4 R
-F2(db_open)3.537 E F0 1.036(for the btree access method are as described in)
-3.536 F F2(db_open)3.536 E F0 1.036(\(3\), with the).24 F(follo)108 278.4 Q
-(wing e)-.25 E(xceptions and additions:)-.15 E 5.28(type The)108 295.2 R
-(type is DB_RECNO.)2.5 E 9.72(put Using)108 312 R(the)2.558 E F2(put)2.558 E F0
-(interf)2.559 E .059(ace to create a ne)-.1 F 2.559(wr)-.25 G .059
-(ecord will cause the creation of multiple, empty records if the)293.07 312 R
-(record number is more than one greater than the lar)133 324 Q
-(gest record currently in the database.)-.18 E(The)133 340.8 Q F2(put)2.5 E F0
-(function tak)2.5 E(es the follo)-.1 E(wing additional \215ags:)-.25 E
-(R_IAFTER)133 357.6 Q 1.225
-(Append the data immediately after the data referenced by)158 369.6 R F2 -.1
-(ke)3.724 G(y)-.2 E F0 3.724(,c).32 G 1.224(reating a ne)425.354 369.6 R 3.724
-(wk)-.25 G -.15(ey)490.046 369.6 S 1.224(/data pair).15 F(.)-.55 E
-(The record number of the appended k)158 381.6 Q -.15(ey)-.1 G
-(/data pair is returned in the).15 E F2 -.1(ke)2.5 G(y)-.2 E F0(structure.)2.5
-E(R_IBEFORE)133 398.4 Q 1.343
-(Insert the data immediately before the data referenced by)158 410.4 R F2 -.1
-(ke)3.844 G(y)-.2 E F0 3.844(,c).32 G 1.344(reating a ne)424.874 410.4 R 3.844
-(wk)-.25 G -.15(ey)489.926 410.4 S 1.344(/data pair).15 F(.)-.55 E
-(The record number of the inserted k)158 422.4 Q -.15(ey)-.1 G
-(/data pair is returned in the).15 E F2 -.1(ke)2.5 G(y)-.2 E F0(structure.)2.5
-E(R_SETCURSOR)133 439.2 Q(Store the k)158 451.2 Q -.15(ey)-.1 G(/data pair).15
-E 2.5(,s)-.4 G
-(etting or initializing the position of the cursor to reference it.)256.5 451.2
-Q 9.17(seq The)108 468 R F2(seq)2.5 E F0(function tak)2.5 E(es the follo)-.1 E
-(wing additional \215ags:)-.25 E(R_LAST)133 484.8 Q .04(The last k)158 496.8 R
--.15(ey)-.1 G .04(/data pair of the database is returned, and the cursor is se\
-t or initialized to reference).15 F(it.)158 508.8 Q(R_PREV)133 525.6 Q(Retrie)
-158 537.6 Q .59 -.15(ve t)-.25 H .29(he k).15 F -.15(ey)-.1 G .29
-(/data pair immediately before the cursor).15 F 5.29(.I)-.55 G 2.79(ft)395.73
-537.6 S .29(he cursor is not yet set, this is the)404.63 537.6 R
-(same as the R_LAST \215ag.)158 549.6 Q .749
-(If the database \214le is a character special \214le and no complete k)133
-566.4 R -.15(ey)-.1 G .748(/data pairs are currently a).15 F -.25(va)-.2 G
-(ilable,).25 E(the)133 578.4 Q F2(seq)2.5 E F0(function returns 2.)2.5 E 4.17
-(sync The)108 595.2 R F2(sync)2.5 E F0(function tak)2.5 E(es the follo)-.1 E
-(wing additional \215ag:)-.25 E(R_RECNOSYNC)133 612 Q .643
-(This \215ag causes the)158 624 R F2(sync)3.143 E F0 .644
-(function to apply to the btree \214le which underlies the recno \214le, not)
-3.143 F .09(the recno \214le itself.)158 636 R .09(\(See the)5.09 F F2(bfname)
-2.59 E F0 .09(\214eld of RECNOINFO structure, abo)2.59 F -.15(ve)-.15 G 2.59
-(,f).15 G .09(or more informa-)470.95 636 R(tion.\))158 648 Q F1(ERR)72 664.8 Q
-(ORS)-.27 E F0(The)108 676.8 Q F2 -.37(re)3.731 G(cno).37 E F0 1.231
-(access method functions may f)3.731 F 1.231(ail and set)-.1 F F2(errno)3.731 E
-F0 1.231(for an)3.731 F 3.731(yo)-.15 G 3.731(ft)392.652 676.8 S 1.231
-(he errors speci\214ed for the library)402.493 676.8 R(function)108 688.8 Q F2
-(db_open)2.5 E F0(\(3\) or the follo).24 E(wing:)-.25 E(4.4 Berk)72 732 Q(ele)
--.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q 99.315(ution August)-.2 F(1, 1995)2.5 E
-(2)535 732 Q EP
-%%Page: 3 24
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 111.23(DB_RECNO\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 111.23(anual DB_RECNO\(3\))340.17 48 R([EINV)108 84 Q(AL])-1.35 E
-(An attempt w)133 96 Q(as made to add a record to a \214x)-.1 E
-(ed-length database that w)-.15 E(as too lar)-.1 E(ge to \214t.)-.18 E/F1 9
-/Times-Bold@0 SF(SEE ALSO)72 112.8 Q/F2 10/Times-Italic@0 SF(db_btr)108 124.8 Q
-(ee)-.37 E F0(\(3\),).18 E F2(db_hash)2.5 E F0(\(3\),).28 E F2(db_loc)2.5 E(k)
--.2 E F0(\(3\),).67 E F2(db_lo)2.5 E(g)-.1 E F0(\(3\),).22 E F2(db_mpool)2.5 E
-F0(\(3\),).51 E F2(db_open)2.5 E F0(\(3\),).24 E F2(db_txn)2.5 E F0(\(3\)).24 E
-F2 2.755(Document Pr)108 148.8 R 2.755
-(ocessing in a Relational Database System)-.45 F F0 5.254(,M).32 G 2.754
-(ichael Stonebrak)362.134 148.8 R(er)-.1 E 5.254(,H)-.4 G 2.754(eidi Stettner)
-454.062 148.8 R 5.254(,J)-.4 G(oseph)516.67 148.8 Q
-(Kalash, Antonin Guttman, Nadene L)108 160.8 Q
-(ynn, Memorandum No. UCB/ERL M82/32, May 1982.)-.55 E F1 -.09(BU)72 177.6 S(GS)
-.09 E F0(The)108 189.6 Q F2(sync)3.616 E F0(function')3.616 E 3.616(sR)-.55 G
-1.116(_RECNOSYNC interf)198.838 189.6 R 1.117
-(ace is a kluge, and will be deleted in a future v)-.1 F 1.117(ersion of the)
--.15 F(interf)108 201.6 Q(ace.)-.1 E(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G
-(istrib)132.57 732 Q 99.315(ution August)-.2 F(1, 1995)2.5 E(3)535 732 Q EP
-%%Page: 1 25
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 124.57(DB_TXN\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 124.57(anual DB_TXN\(3\))340.17 48 R/F1 9/Times-Bold@0 SF -.18(NA)72
-84 S(ME).18 E F0(db_txn \255 transaction management functions)108 96 Q F1
-(SYNOPSIS)72 112.8 Q/F2 10/Times-Bold@0 SF(#include <db)108 124.8 Q(.h>)-.4 E
-(#include <db_lock.h>)108 136.8 Q(int)108 160.8 Q(txn_cr)108 172.8 Q
-(eate\(const char *path, mode_t mode, u_int maxtxns, u_int \215ags\);)-.18 E
-(TXNMGR *)108 196.8 Q(txn_open\(const char *path, DBT *logp, LOCK_T)108 208.8 Q
-(ABLE_T *lockp,)-.9 E(int \(*r)158 220.8 Q(eco)-.18 E -.1(ve)-.1 G
-(r\)\(DBT *lsn, DBT *log_entry).1 E 2.5(,i)-.55 G(nt isundo\)\);)340.11 220.8 Q
-(TXN *)108 244.8 Q(txn_begin\(TXNMGR *txnp\);)108 256.8 Q(int)108 280.8 Q
-(txn_commit\(TXN *tid\);)108 292.8 Q(int)108 316.8 Q(txn_pr)108 328.8 Q(epar)
--.18 E(e\(TXN *tid\);)-.18 E(int)108 352.8 Q(txn_abort\(TXN *tid\);)108 364.8 Q
-(int)108 388.8 Q(txn_close\(TXNMGR *txnp\);)108 400.8 Q(int)108 424.8 Q
-(txn_unlink\(const char *path, int f)108 436.8 Q(or)-.25 E(ce\);)-.18 E F1
-(DESCRIPTION)72 453.6 Q F0(speci\214c details of the transaction support.)108
-465.6 Q/F3 10/Times-Italic@0 SF(Db_txn)108 482.4 Q F0 .034
-(is the library interf)2.534 F .034(ace that pro)-.1 F .034
-(vides transaction semantics.)-.15 F .034(Full transaction support is pro)5.034
-F .034(vided by a)-.15 F .722(collection of modules that pro)108 494.4 R .723
-(vide well de\214ned interf)-.15 F .723
-(aces to the services required for transaction process-)-.1 F 3.488(ing. These)
-108 506.4 R .988(services are reco)3.488 F -.15(ve)-.15 G .988(ry \(see).15 F
-F3(db_lo)3.488 E(g)-.1 E F0 .988(\(3\)\), concurrenc).22 F 3.488(yc)-.15 G .988
-(ontrol \(see)371.864 506.4 R F3(db_loc)3.487 E(k)-.2 E F0 .987
-(\(3\)\), and the manage-).67 F 2.201(ment of shared data \(see)108 518.4 R F3
-(db_mpool)4.701 E F0 4.701(\(3\)\). T).51 F 2.202
-(ransaction semantics can be applied to the access methods)-.35 F(described in)
-108 530.4 Q F3(db)2.5 E F0(\(3\) through function call parameters.).23 E .629(\
-The model intended for transactional use \(and that is used by the access meth\
-ods\) is that write-ahead log-)108 547.2 R .047(ging is pro)108 559.2 R .047
-(vided by)-.15 F F3(db_lo)2.547 E(g)-.1 E F0 .047
-(\(3\) to record both before- and after).22 F .048(-image logging.)-.2 F .048
-(Locking follo)5.048 F .048(ws a tw)-.25 F(o-phase)-.1 E
-(protocol and is implemented by)108 571.2 Q F3(db_loc)2.5 E(k)-.2 E F0(\(3\).)
-.67 E .549(The function)108 588 R F3(txn_cr)3.049 E(eate)-.37 E F0 .549
-(creates and initializes the transaction re)3.049 F .548
-(gion identi\214ed by the)-.15 F F3(path)3.048 E F0(directory)3.048 E 5.548(.T)
--.65 G(his)528.33 588 Q .572(directory must already e)108 600 R .572(xist when)
--.15 F F3(txn_cr)3.072 E(eate)-.37 E F0 .572(is called.)3.072 F .572
-(If the transaction re)5.572 F .572(gion identi\214ed by)-.15 F F3(path)3.072 E
-F0(already)3.072 E -.15(ex)108 612 S 1.78(ists, then).15 F F3(txn_cr)4.28 E
-(eate)-.37 E F0 1.78(returns success without further action.)4.28 F 1.78
-(The \214les associated with the transaction)6.78 F(re)108 624 Q .293
-(gion are created in the directory speci\214ed by)-.15 F F3(path)2.793 E F0
-5.293(.\().28 G .293(The group of the created \214les is based on the system)
-327.657 624 R .781(and directory def)108 636 R .781
-(aults, and is not further speci\214ed by)-.1 F F3(txn_cr)3.281 E(eate)-.37 E
-F0 3.281(.\) All).18 F .78(\214les created by)3.28 F F3(txn_cr)3.28 E(eate)-.37
-E F0 .78(are cre-)3.28 F .048(ated with mode)108 648 R F3(mode)2.548 E F0 .049
-(\(as described in)2.548 F F3 -.15(ch)2.549 G(mod).15 E F0 .049
-(\(2\)\) and modi\214ed by the process' umask v).77 F .049(alue \(see)-.25 F F3
-(umask)2.549 E F0(\(2\)\).).67 E(An)108 660 Q 2.5(yn)-.15 G(ecessary)132.57 660
-Q 2.5(,a)-.65 G(ssociated log and lock re)175.23 660 Q
-(gions are created as well \(see)-.15 E F3(db_lo)2.5 E(g)-.1 E F0(\(3\) and).22
-E F3(db_loc)2.5 E(k)-.2 E F0(\(3\)\).).67 E(The)108 676.8 Q F3(maxtxns)4.191 E
-F0(ar)4.191 E 1.691(gument speci\214es the maximum number of simultaneous tran\
-sactions that are supported.)-.18 F .229
-(This bounds the size of backing \214les and is used to deri)108 688.8 R .529
--.15(ve l)-.25 H .229(imits for the size of the lock re).15 F .229
-(gion and log\214les.)-.15 F(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)
-132.57 732 Q 99.315(ution August)-.2 F(1, 1995)2.5 E(1)535 732 Q EP
-%%Page: 2 26
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 124.57(DB_TXN\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 124.57(anual DB_TXN\(3\))340.17 48 R(When there are more than)108 84
-Q/F1 10/Times-Italic@0 SF(maxtxns)2.5 E F0(concurrent transactions, calls to)
-2.5 E F1(txn_be)2.5 E(gin)-.4 E F0(may f)2.5 E(ail.)-.1 E(Def)108 100.8 Q .847
-(ault locking and logging protocols are pro)-.1 F .846
-(vided only if the backing \214les e)-.15 F 3.346(xist. If)-.15 F .846
-(the backing \214les do)3.346 F 1.433(not e)108 112.8 R 1.433(xist, the)-.15 F
-F1<8d61>3.933 E(gs)-.1 E F0 1.434
-(parameter must indicate both a logging mode and locking mode speci\214ed by)
-3.933 F F1(or)3.934 E F0('ing).73 E(together at most one \215ag from each of t\
-he TXN_LOCK and TXN_LOG classes as follo)108 124.8 Q(ws:)-.25 E(TXN_LOCK_2PL)
-108 141.6 Q(Use tw)133 153.6 Q(o-phase locking.)-.1 E(TXN_LOCK_OPTIMISTIC)108
-170.4 Q(Use optimistic locking \(not currently implemented\).)133 182.4 Q
-(TXN_LOG_REDO)108 199.2 Q(Pro)133 211.2 Q
-(vide redo-only logging \(not currently implemented\).)-.15 E(TXN_LOG_UNDO)108
-228 Q(Pro)133 240 Q(vide undo-only logging \(not currently implemented\).)-.15
-E(TXN_LOG_UNDOREDO)108 256.8 Q(Pro)133 268.8 Q
-(vide undo/redo write-ahead logging.)-.15 E(The function)108 285.6 Q F1(txn_cr)
-2.5 E(eate)-.37 E F0(returns -1 on f)2.5 E(ailure, setting)-.1 E F1(errno)2.5 E
-F0 2.5(,a).18 G(nd 0 on success.)351.83 285.6 Q 1.892(The function)108 302.4 R
-F1(txn_open)4.392 E F0 1.892(returns a pointer to the transaction re)4.392 F
-1.892(gion identi\214ed by)-.15 F F1(path)4.392 E F0 4.392(,w).28 G 1.892
-(hich must ha)476.016 302.4 R -.15(ve)-.2 G .239
-(already been created by a call to)108 314.4 R F1(txn_cr)2.739 E(eate)-.37 E F0
-5.239(.T).18 G .239(he process must ha)296.88 314.4 R .539 -.15(ve p)-.2 H .239
-(ermission to read and write \214les with).15 F -.25(ow)108 326.4 S .327
-(ners, groups and permissions as described for).25 F F1(txn_cr)2.826 E(eate)
--.37 E F0 5.326(.T).18 G(he)362.624 326.4 Q F1(txn_open)2.826 E F0 .326
-(function returns NULL on f)2.826 F(ail-)-.1 E(ure, setting)108 338.4 Q F1
-(errno)2.5 E F0(.).18 E(The)108 355.2 Q F1 -.37(re)3.181 G(co).37 E(ver)-.1 E
-F0(ar)3.181 E .681(gument speci\214es a function that is called by)-.18 F F1
-(txn_abort)3.181 E F0 .682(during transaction abort.)3.182 F .682(This func-)
-5.682 F(tion tak)108 367.2 Q(es three ar)-.1 E(guments:)-.18 E 10.83(lsn A)108
-384 R(log sequence number \(LSN\).)2.5 E(log_entry)108 400.8 Q 2.5(Al)133 412.8
-S(og record.)145.5 412.8 Q(isundo)108 429.6 Q(An undo \215ag set to 0 if the o\
-peration is a redo and set to 1 if the operation an undo.)133 441.6 Q 1.498
-(As discussed in the)108 458.4 R F1(db_lo)3.998 E 3.998(g\()-.1 G(3\))228.44
-458.4 Q F0 1.497(manual page, the application is responsible for pro)3.997 F
-1.497(viding an)-.15 F 3.997(yn)-.15 G(ecessary)506.13 458.4 Q .486
-(structure to the log record.)108 470.4 R -.15(Fo)5.486 G 2.986(re).15 G .487
-(xample, the application must understand what part of the log record is an)
-242.256 470.4 R(operation code, what part is redo information, and what part i\
-s undo information.)108 482.4 Q(The)108 499.2 Q F1(txn_be)2.785 E(gin)-.4 E F0
-.285(function creates a ne)2.785 F 2.784(wt)-.25 G .284
-(ransaction in the designated transaction manager)264.018 499.2 R 2.784(,r)-.4
-G .284(eturning a pointer)468.332 499.2 R
-(to a TXN that uniquely identi\214es it.)108 511.2 Q(The)108 528 Q F1
-(txn_commit)2.615 E F0 .115(function ends the transaction speci\214ed by the)
-2.615 F F1(tid)2.615 E F0(ar)2.615 E 2.615(gument. An)-.18 F 2.615(yl)-.15 G
-.115(ocks held by the transac-)440.12 528 R(tion are released.)108 540 Q
-(If logging is enabled, a commit log record is written and \215ushed to disk.)5
-E(The)108 556.8 Q F1(txn_abort)2.889 E F0 .389
-(function causes an abnormal termination of the transaction.)2.889 F .388
-(If logging is enabled, the log is)5.389 F 2.312(played backw)108 568.8 R 2.312
-(ards and an)-.1 F 4.812(yr)-.15 G(eco)228.628 568.8 Q -.15(ve)-.15 G 2.312
-(ry operations are initiated through the).15 F F1 -.37(re)4.813 G(co).37 E(ver)
--.1 E F0 2.313(function speci\214ed to)4.813 F F1(txn_open)108 580.8 Q F0 5(.A)
-.24 G(fter reco)159.62 580.8 Q -.15(ve)-.15 G
-(ry is completed, all locks held by the transaction are released.).15 E(The)108
-597.6 Q F1(txn_close)3.824 E F0 1.323
-(function detaches a process from the transaction en)3.823 F 1.323
-(vironment speci\214ed by the TXNMGR)-.4 F(pointer)108 609.6 Q 5.261(.A)-.55 G
-.261(ll mapped re)150.761 609.6 R .261(gions are unmapped and an)-.15 F 2.761
-(ya)-.15 G .262(llocated resources are freed.)323.638 609.6 R(An)5.262 E 2.762
-(yu)-.15 G .262(ncommitted trans-)466.688 609.6 R(actions are aborted.)108
-621.6 Q .69(The function)108 638.4 R F1(txn_unlink)3.19 E F0(destro)3.19 E .69
-(ys the transaction re)-.1 F .69(gion identi\214ed by the directory)-.15 F F1
-(path)3.19 E F0 3.19(,r).28 G(emo)472.1 638.4 Q .69(ving all \214les)-.15 F
-1.78(used to implement the transaction re)108 650.4 R 4.28(gion. \(The)-.15 F
-(directory)4.28 E F1(path)4.28 E F0 1.78(is not remo)4.28 F -.15(ve)-.15 G 4.28
-(d.\) If).15 F 1.78(there are processes)4.28 F .553(which ha)108 662.4 R .853
--.15(ve c)-.2 H(alled).15 E F1(txn_open)3.052 E F0 .552(without calling)3.052 F
-F1(txn_close)3.052 E F0 .552
-(\(i.e., there are processes currently using the transac-)3.052 F .135(tion re)
-108 674.4 R(gion\),)-.15 E F1(txn_unlink)2.635 E F0 .135(will f)2.635 F .135
-(ail without further action, unless the force \215ag is set, in which case)-.1
-F F1(txn_unlink)2.636 E F0 1.67(will attempt to delete the transaction re)108
-686.4 R 1.67(gion \214les re)-.15 F -.05(ga)-.15 G 1.67(rdless of an).05 F 4.17
-(yp)-.15 G 1.67(rocesses still using the transaction)397.22 686.4 R(4.4 Berk)72
-732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q 99.315(ution August)-.2 F
-(1, 1995)2.5 E(2)535 732 Q EP
-%%Page: 3 27
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 124.57(DB_TXN\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 124.57(anual DB_TXN\(3\))340.17 48 R(re)108 84 Q 2.996(gion. An)-.15
-F 2.996(ya)-.15 G .496(ccesses to a remo)165.902 84 R -.15(ve)-.15 G 2.997(dt)
-.15 G .497(ransaction re)257.007 84 R .497(gion will lik)-.15 F .497
-(ely result in une)-.1 F .497(xpected beha)-.15 F(vior)-.2 E 5.497(.T)-.55 G
-.497(he func-)506.463 84 R(tion)108 96 Q/F1 10/Times-Italic@0 SF(txn_unlink)2.5
-E F0(returns -1 on f)2.5 E(ailure, setting)-.1 E F1(errno)2.5 E F0 2.5(,a).18 G
-(nd 0 on success.)316.39 96 Q .51(In the case of catastrophic or system f)108
-112.8 R .51(ailure, it is possible to clean up a transaction re)-.1 F .51
-(gion by remo)-.15 F .51(ving all)-.15 F .34
-(of the \214les in the directory speci\214ed to the)108 124.8 R F1(txn_cr)2.841
-E(eate)-.37 E F0 .341(function, as transaction re)2.841 F .341
-(gion \214les are ne)-.15 F -.15(ve)-.25 G 2.841(rc).15 G(reated)515.57 124.8 Q
-(in an)108 136.8 Q 2.5(yd)-.15 G(irectory other than the one speci\214ed to)
-140.07 136.8 Q F1(txn_cr)2.5 E(eate)-.37 E F0(.).18 E(The)108 153.6 Q F1
-(txn_pr)3.42 E(epar)-.37 E(e)-.37 E F0 .92(function initiates the be)3.42 F
-.919(ginning of a tw)-.15 F 3.419(op)-.1 G .919(hase commit.)352.206 153.6 R
-.919(In a distrib)5.919 F .919(uted transaction, the)-.2 F .185
-(prepare directi)108 165.6 R .485 -.15(ve s)-.25 H .185
-(hould be issued to all participating transaction managers.).15 F .185
-(Each manager must tak)5.185 F 2.685(ew)-.1 G(hat-)524.45 165.6 Q -2.15 -.25
-(ev e)108 177.6 T 2.5(ra).25 G
-(ction is necessary to guarantee that a future call to)131.75 177.6 Q F1
-(txn_commit)2.5 E F0(on the speci\214ed)2.5 E F1(tid)2.5 E F0(will succeed.)2.5
-E/F2 9/Times-Bold@0 SF(SYSTEM INTEGRA)72 194.4 Q(TION)-.855 E F0 .28
-(This model can be applied to data bases other than the pro)108 206.4 R .279
-(vided access methods.)-.15 F -.15(Fo)5.279 G 2.779(re).15 G .279
-(xample, consider an)459.182 206.4 R .15(application that pro)108 218.4 R .15
-(vides transaction semantics to data stored in re)-.15 F .15
-(gular \214les accessed using the)-.15 F F1 -.37(re)2.65 G(ad).37 E F0 .15
-(\(2\) and).77 F F1(write)108 230.4 Q F0 .708(\(2\) system calls.).18 F .707
-(The operations for which transaction protection is desired are brack)5.708 F
-.707(eted by calls to)-.1 F F1(txn_be)108 242.4 Q(gin)-.4 E F0(and)2.5 E F1
-(txn_commit)2.5 E F0(.).68 E .606
-(Before data are referenced, a call is made to the lock manager)108 259.2 R(,)
--.4 E F1(db_loc)3.106 E(k)-.2 E F0 3.106(,f).67 G .606
-(or a lock of the appropriate type)408.064 259.2 R .719
-(\(e.g. read\) on the object being lock)108 271.2 R 3.218(ed. The)-.1 F .718
-(object might be a page in the \214le, a byte, a range of bytes, or)3.218 F
-.572(some k)108 283.2 R -.15(ey)-.1 G 5.572(.B)-.5 G .573
-(efore a write is performed, the application mak)160.464 283.2 R .573
-(es a call to the log manager)-.1 F(,)-.4 E F1(db_lo)3.073 E(g)-.1 E F0 3.073
-(,t).22 G 3.073(or)506.387 283.2 S(ecord)517.79 283.2 Q .522
-(enough information to redo the operation in case of f)108 295.2 R .522
-(ailure after commit and to undo the operation in case)-.1 F .609(of abort.)108
-307.2 R .609
-(After the log message is written, the write system calls are issued.)5.609 F
-.61(After all requests are issued,)5.61 F .518(the application calls)108 319.2
-R F1(txn_commit)3.017 E F0 5.517(.W).68 G(hen)256.84 319.2 Q F1(txn_commit)
-3.017 E F0 .517(returns, the caller is guaranteed that all necessary log)3.017
-F(writes ha)108 331.2 Q .3 -.15(ve b)-.2 H(een written to disk.).15 E 1.081
-(At an)108 348 R 3.581(yt)-.15 G 1.081(ime, the application may call)142.232
-348 R F1(txn_abort)3.581 E F0 3.581(,w).68 G 1.081
-(hich will result in the appropriate calls to the)318.828 348 R F1 -.37(re)
-3.582 G(co).37 E(ver)-.1 E F0 .278(routine to restore the `)108 360 R
-(`database')-.74 E 2.778('t)-.74 G 2.778(oac)246.48 360 S .278
-(onsistent pre-transaction state.)265.916 360 R .277(\(The reco)5.277 F -.15
-(ve)-.15 G 2.777(rr).15 G .277(outine must be able to)450.562 360 R
-(either reapply or undo the update depending on the conte)108 372 Q
-(xt, for each dif)-.15 E(ferent type of log record.\))-.25 E .746
-(If the application should crash, the reco)108 388.8 R -.15(ve)-.15 G .746
-(ry process uses the).15 F F1(db_lo)3.246 E(g)-.1 E F0(interf)3.246 E .746
-(ace to read the log and call the)-.1 F F1 -.37(re)108 400.8 S(co).37 E(ver)-.1
-E F0(routine to restore the database to a consistent state.)2.5 E(The)108 417.6
-Q F1(txn_pr)3.098 E(epar)-.37 E(e)-.37 E F0 .598(function pro)3.098 F .598
-(vides the core functionality to implement distrib)-.15 F .597
-(uted transactions, b)-.2 F .597(ut it does)-.2 F .36
-(not actually manage the noti\214cation of distrib)108 429.6 R .36
-(uted transaction managers.)-.2 F .36(The caller is responsible for issu-)5.36
-F(ing)108 441.6 Q F1(txn_pr)2.82 E(epar)-.37 E(e)-.37 E F0 .32
-(calls to all sites participating in the transaction.)2.82 F .319
-(If all responses are positi)5.319 F -.15(ve)-.25 G 2.819(,t).15 G .319
-(he caller can)488.832 441.6 R .822(issue a)108 453.6 R F1(txn_commit)3.322 E
-F0 5.822(.I).68 G 3.322(fa)198.076 453.6 S 1.122 -.15(ny o)209.168 453.6 T
-3.322(ft).15 G .822(he responses are ne)236.772 453.6 R -.05(ga)-.15 G(ti).05 E
--.15(ve)-.25 G 3.322(,t).15 G .823(he caller should issue a)349.15 453.6 R F1
-(txn_abort)3.323 E F0 5.823(.I).68 G 3.323(ng)499.747 453.6 S(eneral,)513.07
-453.6 Q(the)108 465.6 Q F1(txn_pr)2.5 E(epar)-.37 E(e)-.37 E F0
-(call requires that the transaction log be \215ushed to disk.)2.5 E .821
-(The structure of the transaction support allo)108 482.4 R .821
-(ws application designers to trade of)-.25 F 3.32(fp)-.25 G .82
-(erformance and protec-)445.07 482.4 R 3.948(tion. Since)108 494.4 R 1.448
-(DB manages man)3.948 F 3.948(ys)-.15 G 1.448(tructures in shared memory)245.36
-494.4 R 3.948(,i)-.65 G 1.448(ts information is subject to corruption by)
-367.982 494.4 R 1.306(applications when the library is link)108 506.4 R 1.306
-(ed directly with the application.)-.1 F -.15(Fo)6.306 G 3.805(rt).15 G 1.305
-(his reason, DB is designed to)416.815 506.4 R(allo)108 518.4 Q 3.367(wc)-.25 G
-.867(ompilation into a separate serv)137.777 518.4 R .868
-(er process that may be accessed via a sock)-.15 F .868(et interf)-.1 F 3.368
-(ace. In)-.1 F .868(this w)3.368 F(ay)-.1 E(DB')108 530.4 Q 2.828(sd)-.55 G
-.328(ata structures are protected from application code, b)136.388 530.4 R .328
-(ut communication o)-.2 F -.15(ve)-.15 G .327(rhead is increased.).15 F(When)
-5.327 E(applications are trusted, DB may be compiled directly into the applica\
-tion for increased performance.)108 542.4 Q F2(ERR)72 559.2 Q(ORS)-.27 E F0
-(The)108 571.2 Q F1(txn_cr)4.113 E(eate)-.37 E F0 1.613(function may f)4.113 F
-1.613(ail and set)-.1 F F1(errno)4.113 E F0 1.614(for an)4.113 F 4.114(yo)-.15
-G 4.114(ft)349.022 571.2 S 1.614
-(he errors speci\214ed for the library functions)359.246 571.2 R F1(open)108
-583.2 Q F0(\(2\),).24 E F1(write)2.5 E F0(\(2\),).18 E F1(malloc)2.5 E F0
-(\(3\),).31 E F1(loc)2.5 E(k_cr)-.2 E(eate)-.37 E F0(\(3\), and).18 E F1(lo)2.5
-E(g_cr)-.1 E(eate)-.37 E F0(\(3\).).18 E(The)108 600 Q F1(txn_open)2.509 E F0
-.009(function may f)2.509 F .009(ail and set)-.1 F F1(errno)2.508 E F0 .008
-(to an)2.508 F 2.508(yo)-.15 G 2.508(ft)323.916 600 S .008
-(he errors speci\214ed for the library functions)332.534 600 R F1(open)2.508 E
-F0(\(2\),).24 E F1(write)108 612 Q F0(\(2\),).18 E F1(malloc)2.5 E F0(\(3\),)
-.31 E F1(loc)2.5 E(k_open)-.2 E F0(\(3\), and).24 E F1(lo)2.5 E(g_open)-.1 E F0
-(\(3\).).24 E(The)108 628.8 Q F1(txn_be)2.671 E(gin)-.4 E F0 .171
-(function may f)2.671 F .171(ail and set)-.1 F F1(errno)2.671 E F0 .171
-(to ENOSPC indicating that the maximum number of concur)2.671 F(-)-.2 E
-(rent transactions has been reached.)108 640.8 Q(The)108 657.6 Q F1(txn_commit)
-2.5 E F0(function may f)2.5 E(ail and set)-.1 E F1(errno)2.5 E F0(to EINV)2.5 E
-(AL indicating that the transaction w)-1.35 E(as aborted.)-.1 E(The)108 674.4 Q
-F1(txn_close)4.582 E F0 2.082(function may f)4.582 F 2.081(ail and set)-.1 F F1
-(errno)4.581 E F0 2.081(to an)4.581 F 4.581(yo)-.15 G 4.581(ft)345.753 674.4 S
-2.081(he errors speci\214ed for the library functions)356.444 674.4 R F1(close)
-108 686.4 Q F0(\(2\),).18 E F1 -.37(re)2.5 G(ad).37 E F0(\(2\),).77 E F1(write)
-2.5 E F0(\(2\),).18 E F1(fr)2.5 E(ee)-.37 E F0(\(3\),).18 E F1(fsync)2.5 E F0
-(\(2\),).31 E F1(loc)2.5 E(k_close)-.2 E F0(\(3\) or).18 E F1(lo)2.5 E(g_close)
--.1 E F0(\(3\).).18 E(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57
-732 Q 99.315(ution August)-.2 F(1, 1995)2.5 E(3)535 732 Q EP
-%%Page: 4 28
-%%BeginPageSetup
-BP
-%%EndPageSetup
-/F0 10/Times-Roman@0 SF 124.57(DB_TXN\(3\) BSD)72 48 R(Programmer')2.5 E 2.5
-(sM)-.55 G 124.57(anual DB_TXN\(3\))340.17 48 R(The)108 84 Q/F1 10
-/Times-Italic@0 SF(txn_unlink)4.319 E F0 1.819(function may f)4.319 F 1.819
-(ail and set)-.1 F F1(errno)4.319 E F0 1.819(to an)4.319 F 4.319(yo)-.15 G 4.32
-(ft)347.58 84 S 1.82(he errors speci\214ed for the library functions)358.01 84
-R F1(unlink)108 96 Q F0(\(2\),).67 E F1(loc)2.5 E(k_unlink)-.2 E F0(\(3\), and)
-.67 E F1(lo)2.5 E(g_unlink)-.1 E F0(\(3\), or the follo).67 E(wing:)-.25 E([EB)
-108 112.8 Q(USY])-.1 E(The transaction re)133 124.8 Q(gion w)-.15 E
-(as in use and the force \215ag w)-.1 E(as not set.)-.1 E/F2 9/Times-Bold@0 SF
-(SEE ALSO)72 141.6 Q F1(db_btr)108 153.6 Q(ee)-.37 E F0(\(3\),).18 E F1
-(db_hash)2.5 E F0(\(3\),).28 E F1(db_loc)2.5 E(k)-.2 E F0(\(3\),).67 E F1
-(db_lo)2.5 E(g)-.1 E F0(\(3\),).22 E F1(db_mpool)2.5 E F0(\(3\),).51 E F1
-(db_open)2.5 E F0(\(3\),).24 E F1(db_r)2.5 E(ecno)-.37 E F0(\(3\)).18 E F1 .904
-(LIBTP: P)108 177.6 R(ortable)-.8 E 3.404(,M)-.1 G .904(odular T)189.738 177.6
-R -.15(ra)-.55 G .904(nsactions for UNIX).15 F F0 3.404(,M).94 G(ar)328.884
-177.6 Q .904(go Seltzer)-.18 F 3.403(,M)-.4 G .903
-(ichael Olson, USENIX proceedings,)392.041 177.6 R -.4(Wi)108 189.6 S
-(nter 1992.).4 E F2 -.09(BU)72 206.4 S(GS).09 E F0(The)108 218.4 Q F1(maxtxns)
-2.792 E F0 .292(parameter is a kluge, and should be deleted in f)2.792 F -.2
-(avo)-.1 G 2.793(ro).2 G 2.793(fd)378.448 218.4 S .293(ynamically e)389.571
-218.4 R .293(xpanding the transaction)-.15 F(re)108 230.4 Q(gion.)-.15 E
-(4.4 Berk)72 732 Q(ele)-.1 E 2.5(yD)-.15 G(istrib)132.57 732 Q 99.315
-(ution August)-.2 F(1, 1995)2.5 E(4)535 732 Q EP
-%%Trailer
-end
-%%EOF
diff --git a/src/util/db2/man/db_btree.3 b/src/util/db2/man/db_btree.3
deleted file mode 100644
index 25e289f3cd..0000000000
--- a/src/util/db2/man/db_btree.3
+++ /dev/null
@@ -1,246 +0,0 @@
-.\" Copyright (c) 1990, 1993, 1994, 1995
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)db_btree.3 8.11 (Berkeley) 8/1/95
-.\"
-.TH DB_BTREE 3 "August 1, 1995"
-.UC 7
-.SH NAME
-db_btree \- btree database access method
-.SH DESCRIPTION
-.so db.so
-.GN
-specific details of the btree access method.
-.PP
-The btree data structure is a sorted, balanced tree structure storing
-associated key/data pairs.
-Searches, insertions, and deletions in the btree will all complete in
-O lg base N where base is the average fill factor.
-Often, inserting ordered data into btrees results in a low fill factor.
-This implementation has been modified to make ordered insertion the best
-case, resulting in a much better than normal page fill factor.
-.SH "ACCESS METHOD SPECIFIC INFORMATION"
-The btree access method specific data structure provided to
-.I db_open
-is typedef'd and named BTREEINFO.
-A BTREEINFO structure has at least the following fields,
-which may be initialized before calling
-.IR db_open :
-.TP 5
-u_int cachesize;
-A suggested maximum size (in bytes) of the memory cache.
-This value is
-.B only
-advisory, and the access method will allocate more memory rather than fail.
-Since every search examines the root page of the tree, caching the most
-recently used pages substantially improves access time.
-In addition, physical writes are delayed as long as possible, so a moderate
-cache can reduce the number of I/O operations significantly.
-Obviously, using a cache increases (but only increases) the likelihood of
-corruption or lost data if the system crashes while a tree is being modified.
-If
-.I cachesize
-is 0 (no size is specified) a default cache is used.
-.TP 5
-int (*compare)(const DBT *, const DBT *);
-Compare is the key comparison function.
-It must return an integer less than, equal to, or greater than zero if the
-first key argument is considered to be respectively less than, equal to,
-or greater than the second key argument.
-The same comparison function must be used on a given tree every time it
-is opened.
-If
-.I compare
-is NULL (no comparison function is specified), the keys are compared
-lexically, with shorter keys considered less than longer keys.
-.TP 5
-u_long flags;
-The flag value is specified by
-.IR or 'ing
-any of the following values:
-.RS
-.TP 5
-R_DUP
-Permit duplicate keys in the tree, i.e. permit insertion if the key to be
-inserted already exists in the tree.
-The default behavior, as described in
-.IR db_open (3),
-is to overwrite a matching key when inserting a new key or to fail if
-the R_NOOVERWRITE flag is specified.
-The R_DUP flag is overridden by the R_NOOVERWRITE flag, and if the
-R_NOOVERWRITE flag is specified, attempts to insert duplicate keys into
-the tree will fail.
-.IP
-If the database contains duplicate keys, the order of retrieval of
-key/data pairs is undefined if the
-.I get
-function is used, however,
-.I seq
-function calls with the R_CURSOR flag set will always return the logical
-``first'' of any group of duplicate keys.
-.RE
-.TP 5
-int lorder;
-The byte order for integers in the stored database metadata.
-The number should represent the order as an integer; for example,
-big endian order would be the number 4,321.
-If
-.I lorder
-is 0 (no order is specified) the current host order is used.
-.TP 5
-int maxkeypage;
-The maximum number of keys which will be stored on any single page.
-This functionality is not currently implemented.
-.\" The maximum number of keys which will be stored on any single page.
-.\" Because of the way the btree data structure works,
-.\" .I maxkeypage
-.\" must always be greater than or equal to 2.
-.\" If
-.\" .I maxkeypage
-.\" is 0 (no maximum number of keys is specified) the page fill factor is
-.\" made as large as possible (which is almost invariably what is wanted).
-.TP 5
-int minkeypage;
-The minimum number of keys which will be stored on any single page.
-This value is used to determine which keys will be stored on overflow
-pages, i.e. if a key or data item is longer than the pagesize divided
-by the minkeypage value, it will be stored on overflow pages instead
-of in the page itself.
-If
-.I minkeypage
-is 0 (no minimum number of keys is specified) a value of 2 is used.
-.TP 5
-size_t (*prefix)(const DBT *, const DBT *);
-Prefix is the prefix comparison function.
-If specified, this function must return the number of bytes of the second key
-argument which are necessary to determine that it is greater than the first
-key argument.
-If the keys are equal, the key length should be returned.
-Note, the usefulness of this function is very data dependent, but, in some
-data sets can produce significantly reduced tree sizes and search times.
-If
-.I prefix
-is NULL (no prefix function is specified),
-.B and
-no comparison function is specified, a default lexical comparison function
-is used.
-If
-.I prefix
-is NULL and a comparison function is specified, no prefix comparison is
-done.
-.TP 5
-u_int psize;
-Page size is the size (in bytes) of the pages used for nodes in the tree.
-The minimum page size is 512 bytes and the maximum page size is 64K.
-If
-.I psize
-is 0 (no page size is specified) a page size is chosen based on the
-underlying file system I/O block size.
-.PP
-If the file already exists (and the O_TRUNC flag is not specified), the
-values specified for the parameters flags, lorder and psize are ignored
-in favor of the values used when the tree was created.
-.SH "DB OPERATIONS"
-The functions returned by
-.I db_open
-for the btree access method are as described in
-.IR db_open (3),
-with the following exceptions and additions:
-.TP 5
-type
-The type is DB_BTREE.
-.TP 5
-del
-Space freed up by deleting key/data pairs from the tree is never reclaimed,
-although it is reused where possible.
-This means that the btree storage structure is grow-only.
-The only solutions are to avoid excessive deletions, or to create a fresh
-tree periodically from a scan of an existing one.
-.TP 5
-put
-The
-.I put
-function takes the following additional flags:
-.RS
-.TP 5
-R_SETCURSOR
-Store the key/data pair, setting or initializing the position of the
-cursor to reference it.
-.RE
-.TP 5
-seq
-Forward sequential scans of a tree are from the least key to the greatest.
-.IP
-The returned key for the
-.I seq
-function is not necessarily an exact match for the specified key in
-the btree access method.
-The returned key is the smallest key greater than or equal to the
-specified key, permitting partial key matches and range searches.
-.IP
-The
-.I seq
-function takes the following additional flags:
-.RS
-.TP 5
-R_LAST
-The last key/data pair of the database is returned, and the cursor
-is set or initialized to reference it.
-.TP 5
-R_PREV
-Retrieve the key/data pair immediately before the cursor.
-If the cursor is not yet set, this is the same as the R_LAST flag.
-.RE
-.SH ERRORS
-The
-.I btree
-access method functions may fail and set
-.I errno
-for any of the errors specified for the library function
-.IR db_open (3).
-.SH "SEE ALSO"
-.IR db_hash (3),
-.IR db_lock (3),
-.IR db_log (3),
-.IR db_mpool (3),
-.IR db_open (3),
-.IR db_recno (3),
-.IR db_txn (3)
-.sp
-.IR "The Ubiquitous B-tree" ,
-Douglas Comer, ACM Comput. Surv. 11, 2 (June 1979), 121-138.
-.sp
-.IR "Prefix B-trees" ,
-Bayer and Unterauer, ACM Transactions on Database Systems, Vol. 2, 1
-(March 1977), 11-26.
-.sp
-.IR "The Art of Computer Programming Vol. 3: Sorting and Searching" ,
-D.E. Knuth, 1968, pp 471-480.
diff --git a/src/util/db2/man/db_hash.3 b/src/util/db2/man/db_hash.3
deleted file mode 100644
index adb88fca7c..0000000000
--- a/src/util/db2/man/db_hash.3
+++ /dev/null
@@ -1,138 +0,0 @@
-.\" Copyright (c) 1990, 1993, 1994, 1995
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)db_hash.3 8.13 (Berkeley) 8/1/95
-.\"
-.TH DB_HASH 3 "August 1, 1995"
-.UC 7
-.SH NAME
-db_hash \- hash database access method
-.SH DESCRIPTION
-.so db.so
-.GN
-specific details of the hashing access method.
-.PP
-The hash data structure is an extensible, dynamic hashing scheme.
-Backward compatible interfaces to the functions described in
-.IR dbm (3),
-and
-.IR ndbm (3)
-are provided, however these interfaces are not compatible with
-previous file formats.
-.SH "ACCESS METHOD SPECIFIC INFORMATION"
-The hash access method specific data structure provided to
-.I db_open
-is typedef'd and named HASHINFO.
-A HASHINFO structure has at least the following fields,
-which may be initialized before calling
-.IR db_open :
-.TP 5
-u_int bsize;
-.I Bsize
-defines the hash table bucket size, and is, by default, 256 bytes.
-It may be preferable to increase the page size for disk-resident tables
-and tables with large data items.
-.TP 5
-u_int cachesize;
-A suggested maximum size, in bytes, of the memory cache.
-This value is
-.B only
-advisory, and the access method will allocate more memory rather
-than fail.
-.TP 5
-u_int ffactor;
-.I Ffactor
-indicates a desired density within the hash table.
-It is an approximation of the number of keys allowed to accumulate in any
-one bucket, determining when the hash table grows or shrinks.
-The default value is 8.
-.TP 5
-u_int32_t (*hash)(const void *, size_t);
-.I Hash
-is a user defined hash function.
-Since no hash function performs equally well on all possible data, the
-user may find that the built-in hash function does poorly on a particular
-data set.
-User specified hash functions must take two arguments (a pointer to a byte
-string and a length) and return a 32-bit quantity to be used as the hash
-value.
-.IP
-If a hash function is specified,
-.I hash_open
-will attempt to determine if the hash function specified is the same as
-the one with which the database was created, and will fail if it is not.
-.TP 5
-int lorder;
-The byte order for integers in the stored database metadata.
-The number should represent the order as an integer; for example,
-big endian order would be the number 4,321.
-If
-.I lorder
-is 0 (no order is specified) the current host order is used.
-If the file already exists, the specified value is ignored and the
-value specified when the tree was created is used.
-.TP 5
-u_int nelem;
-.I Nelem
-is an estimate of the final size of the hash table.
-If not set or set too low, hash tables will expand gracefully as keys
-are entered, although a slight performance degradation may be noticed.
-The default value is 1.
-.PP
-If the file already exists (and the O_TRUNC flag is not specified), the
-values specified for the parameters bsize, ffactor, lorder and nelem are
-ignored and the values specified when the tree was created are used.
-.SH "DB OPERATIONS"
-The functions returned by
-.I db_open
-for the hash access method are as described in
-.IR db_open (3).
-.SH ERRORS
-The
-.I hash
-access method functions may fail and set
-.I errno
-for any of the errors specified for the library function
-.IR db_open (3).
-.SH "SEE ALSO"
-.IR db_btree (3),
-.IR db_lock (3),
-.IR db_log (3),
-.IR db_mpool (3),
-.IR db_open (3),
-.IR db_recno (3),
-.IR db_txn (3)
-.sp
-.IR "Dynamic Hash Tables" ,
-Per-Ake Larson, Communications of the ACM, April 1988.
-.sp
-.IR "A New Hash Package for UNIX" ,
-Margo Seltzer, USENIX Proceedings, Winter 1991.
diff --git a/src/util/db2/man/db_lock.3 b/src/util/db2/man/db_lock.3
deleted file mode 100644
index b18a38c60c..0000000000
--- a/src/util/db2/man/db_lock.3
+++ /dev/null
@@ -1,462 +0,0 @@
-.\" Copyright (c) 1994, 1995
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)db_lock.3 8.14 (Berkeley) 8/1/95
-.\"
-.TH DB_LOCK 3 "August 1, 1995"
-.UC 7
-.SH NAME
-db_lock \- general purpose lock manager
-.SH SYNOPSIS
-.nf
-.ft B
-#include <db_lock.h>
-
-int
-lock_create(const char *path, mode_t mode,
-.ti +5
-int lock_modes, const int8_t conflicts[][], u_int maxlocks);
-
-LOCK_TABLE_T *
-lock_open(const char *path);
-
-int
-lock_vec(LOCK_TABLE_T *lt, DBT *locker, struct timespec *timeout,
-.ti +5
-LOCK_REQ_T list[], int nlist, LOCK_REQ_T **elistp, DBT *conflict);
-
-int
-lock_get(LOCK_TABLE_T *lt, const DBT *locker,
-.ti +5
-const DBT *obj, const lock_mode_t lock_mode, LOCK_T **lockp);
-
-int
-lock_put(LOCK_T *lockp);
-
-int
-lock_close(LOCK_TABLE_T *lt);
-
-int
-lock_unlink(const char *path, int force);
-.ft R
-.fi
-.SH DESCRIPTION
-.so db.so
-.GN
-specific details of the locking interface.
-.PP
-.I Db_lock
-is the library interface intended to provide general-purpose locking.
-While designed to work with the other DB functions, these functions are
-also useful for more general locking purposes.
-Locks can be shared between processes.
-.PP
-.CR "lock table" lock
-.PP
-The parameter
-.I lock_modes
-is the number of lock modes to be recognized by the lock table
-(including the ``not-granted'' mode).
-The parameter
-.I conflicts
-is an
-.I lock_modes
-by
-.I lock_modes
-array.
-A non-0 value for:
-.sp
-.ti +5
-conflicts[requested_mode][held_mode]
-.sp
-indicates that
-.I requested_mode
-and
-.I held_mode
-conflict.
-The ``not-granted'' mode must be represented by 0.
-.PP
-The include file <db_lock.h> declares two commonly used conflict arrays:
-.TP 5
-int lock_sx_n;
-.br
-.ns
-.TP 5
-const int8_t lock_sx_c[lock_sx_n][lock_sx_n];
-These variables specify a conflict array
-for a simple scheme using shared and exclusive lock modes.
-.TP 5
-int lock_g_n;
-.br
-.ns
-.TP 5
-const int8_t lock_g_c[lock_g_n][lock_g_n];
-These variables specify a conflict array that involves various intent
-lock modes (e.g. intent shared) that are used for multigranularity locking.
-.PP
-In addition,
-<db_lock.h> defines the following macros that name lock modes for use with
-the standard tables above:
-.RS
-.TP 5
-LOCK_IS
-intent shared
-.br
-.ns
-.TP 5
-LOCK_IX
-intent exclusive
-.br
-.ns
-.TP 5
-LOCK_NG
-not granted (always 0)
-.br
-.ns
-.TP 5
-LOCK_S
-shared
-.br
-.ns
-.TP 5
-LOCK_SIX
-shared/intent exclusive
-.br
-.ns
-.TP 5
-LOCK_X
-exclusive
-.RE
-.PP
-.I Maxlocks
-is the maximum number of locks to be held or requested in the table,
-and is used by
-.I lock_create
-to estimate how much space to allocate for various lock-table data
-structures.
-.PP
-.RT lock_create
-.PP
-.OP "lock table" lock
-.PP
-The function
-.I lock_vec
-atomically obtains and releases one or more locks from the designated
-table.
-The function
-.I lock_vec
-is intended to support acquisition or trading of multiple locks
-under one lock table semaphore, as is needed for lock coupling or
-in multigranularity locking for lock escalation.
-.PP
-If any of the requested locks cannot be acquired
-or any of the locks to be released cannot be released,
-no locks are acquired and no locks are released, and
-.I lock_vec
-returns an error.
-The function
-.I lock_vec
-returns 0 on success.
-If an error occurs,
-.I lock_vec
-returns one of the following values.
-In addition, if
-.I elistp
-is not NULL, it is set to point to the LOCK_REQ_T entry which
-was being processed when the error occurred.
-.TP 5
-LOCK_GET_DEADLOCK
-The specified
-.I locker
-was selected as a victim in order to resolve a deadlock.
-In this case, if the
-.I conflict
-argument is non-NULL, it is set to reference the identity of a
-locker holding the lock referenced by
-.I elistp
-at the time the request was denied.
-(This identity resides in static memory and may be overwritten by
-subsequent calls to
-.IR lock_vec ).
-.TP 5
-LOCK_GET_ERROR
-An error occurred and the external variable
-.I errno
-has been set to indicate the error.
-.TP 5
-LOCK_GET_NOTHELD
-The lock cannot be released, as it was not held by the
-.IR locker .
-.TP 5
-LOCK_GET_RESOURCE
-The lock manager is unable to grant the requested locks because of
-limited internal resources.
-(Releasing locks may allow future calls to
-.I lock_vec
-to succeed.)
-.TP 5
-LOCK_GET_TIMEOUT
-A timeout argument was specified, and the requested locks were not
-available soon enough.
-In this case, if the
-.I conflict
-argument is non-NULL, it is set to reference the identity of a
-locker holding the lock referenced by
-.I elistp
-at the time the request was denied.
-(This identity resides in static memory and may be overwritten by
-subsequent calls to
-.IR lock_vec ).
-.PP
-The
-.I locker
-argument specified to
-.I lock_vec
-is a pointer to an untyped byte string which identifies the entity
-requesting or releasing the lock.
-If
-.I locker
-is NULL, the calling process' pid is used instead.
-.PP
-The
-.I timeout
-argument provided to
-.I lock_vec
-specifies a maximum interval to wait for the locks to be granted.
-If
-.I timeout
-is NULL, it is ignored, and
-.I lock_vec
-will not return until all of the locks are acquired or an error has
-occurred.
-.PP
-The
-.I list
-array provided to
-.I lock_vec
-is typedef'd in <db_lock.h> as LOCK_REQ_T.
-A LOCK_REQ_T structure has at least the following fields,
-which must be initialized before calling
-.IR lock_vec :
-.TP 5
-enum lockop op;
-The operation to be performed, which must be set to one of the
-following values:
-.RS
-.TP 5
-LOCK_GET
-Get a lock, as defined by the values of
-.IR locker ,
-.I obj
-and
-.IR lock_mode .
-Upon return from
-.IR lock_vec ,
-if the
-.I lockp
-field is non-NULL, a reference to the acquired lock is stored there.
-(This reference is invalidated by any call to
-.I lock_vec
-or
-.I lock_put
-which releases the lock.)
-.TP 5
-LOCK_PUT
-The lock referenced by the contents of the
-.I lockp
-field is released.
-.TP 5
-LOCK_PUT_ALL
-All locks held by the
-.I locker
-are released.
-(Any locks acquired as a part of the current call to
-.I lock_vec
-are not considered for this operation).
-.TP 5
-LOCK_PUT_OBJ
-All locks held by the
-.IR locker ,
-on the object
-.IR obj ,
-with the mode specified by
-.IR lock_mode ,
-are released.
-A
-.I lock_mode
-of LOCK_NG indicates that all locks on the object should be released.
-(Any locks acquired as a part of the current call to
-.I lock_vec
-are not considered for this operation).
-.RE
-.TP 5
-const DBT obj;
-An untyped byte string which specifies the object to be locked or
-released.
-.TP 5
-const lock_mode_t lock_mode;
-The lock mode, used as an index into
-.IR lt 's
-conflict array.
-.TP 5
-LOCK_T **lockp;
-A pointer to a pointer to a lock reference.
-.PP
-The
-.I nlist
-argument specifies the number of elements in the
-.I list
-array.
-.PP
-The function
-.I lock_get
-is a simple interface to the
-.I lock_vec
-functionality, and is equivalent to calling the
-.I lock_vec
-function with the
-.I lt
-and
-.I locker
-arguments, NULL
-.IR timeout ,
-.I elistp
-and
-.I conflict
-arguments, and a single element
-.I list
-array, for which the
-.I op
-field is LOCK_GET, and the
-.IR obj ,
-.I lock_mode
-and
-.I lockp
-fields are represented by the arguments of the same name.
-Note that the type of the
-.I obj
-argument to
-.I lock_get
-is different from the
-.I obj
-element found in the LOCK_REQ_T structure.
-The
-.I lock_get
-function returns success and failure as described for the
-.I lock_vec
-function.
-.PP
-The function
-.I lock_put
-is a simple interface to the
-.I lock_vec
-functionality, and is equivalent to calling the
-.I lock_vec
-function with a single element
-.I list
-array, for which the
-.I op
-field is LOCK_PUT and the
-.I lockp
-field is represented by the argument of the same name.
-Note that the type of the
-.I lockp
-argument to
-.I lock_put
-is different from the
-.I lockp
-element found in the LOCK_REQ_T structure.
-The
-.I lock_put
-function returns success and failure as described for the
-.I lock_vec
-function.
-.PP
-The function
-.I lock_close
-disassociates the calling process from the lock table
-.IR lt ,
-after releasing all locks held or requested by that process.
-.RT lock_close
-.PP
-.UN "lock table" lock
-.SH "ERRORS"
-The
-.I lock_create
-function may fail and set
-.I errno
-for any of the errors specified for the library routines
-.IR mmap (2),
-.IR open (2)
-and
-.IR malloc (3).
-.PP
-The
-.I lock_open
-function may fail and set
-.I errno
-for any of the errors specified for the library routine
-.IR mmap (2)
-and
-.IR open (2).
-.PP
-The
-.I lock_close
-function may fail and set
-.I errno
-for any of the errors specified for the library routine
-.IR close (2)
-and
-.IR munmap (2).
-.PP
-The
-.I lock_unlink
-function may fail and set
-.I errno
-for any of the errors specified for the library function
-.IR unlink (2)
-or the following:
-.TP 5
-[EBUSY]
-The lock table was in use and the force flag was not set.
-.SH "SEE ALSO"
-.IR db_btree (3),
-.IR db_hash (3),
-.IR db_log (3),
-.IR db_mpool (3),
-.IR db_open (3),
-.IR db_recno (3),
-.IR db_txn (3)
-.SH BUGS
-The
-.I maxlocks
-parameter is a kluge, and should be deleted in favor of dynamically
-expanding the lock table.
diff --git a/src/util/db2/man/db_log.3 b/src/util/db2/man/db_log.3
deleted file mode 100644
index 34c4d1f5d1..0000000000
--- a/src/util/db2/man/db_log.3
+++ /dev/null
@@ -1,290 +0,0 @@
-.\" Copyright (c) 1990, 1993, 1994, 1995
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)db_log.3 8.15 (Berkeley) 8/3/95
-.\"
-.TH DB_LOG 3 "August 3, 1995"
-.UC 7
-.SH NAME
-db_log \- log-manager access method
-.SH DESCRIPTION
-.so db.so
-.GN
-specific details of the logging access method.
-.PP
-These functions provide a general-purpose logging facility sufficient
-for transaction management.
-Logs can be shared by multiple processes.
-.PP
-A log is represented by the directory,
-.IR "not the file" ,
-named by the first argument to
-.IR db_open (3).
-The first argument must be non-NULL,
-and the directory must already exist
-.I db_open
-is called.
-In that directory, the log is stored in one or more files named
-in the format ``log.YYYY.MM.DD.HH.MM.SS'', where ``YYYY.MM.DD.HH.SS''
-is the approximate creation time of the log file, and is guaranteed
-to be unique in the directory.
-.PP
-The group of the created files is based on the system and directory
-defaults, and is not further specified by the log access method.
-All files are created with the
-.I mode
-specified to
-.IR db_open ,
-(as described in
-.IR chmod (2))
-and modified by the process' umask value (see
-.IR umask (2)).
-.PP
-The
-.I flags
-argument to
-.I db_open
-must be 0 for the
-.I db_log
-access method.
-.SH "ACCESS METHOD SPECIFIC INFORMATION"
-The log access method specific data structure provided to
-.I db_open
-is typedef'd and named LOGINFO.
-A LOGINFO structure has at least the following fields,
-which may be initialized before calling
-.IR db_open :
-.TP 5
-off_t max_file_size;
-The maximum size of a single file in the log.
-If not specified, the maximum size defaults to an implementation-specific
-value.
-.TP 5
-int lorder;
-The byte order for integers in the stored database metadata.
-The number should represent the order as an integer; for example,
-big endian order would be the number 4,321.
-If
-.I lorder
-is 0 (no order is specified) the current host order is used.
-.PP
-If the log already exists, the values specified for the parameters
-max_file_size and lorder are ignored in favor of the values used
-when the log was created.
-.SH "DB OPERATIONS"
-The data part of the key/data pair used by the log access method
-is the same as for other access methods.
-The key is different.
-Each log record is identified by a log sequence number (LSN),
-which is stored in a DBT, and which is used as the
-.I key
-for all log functions that take
-.I key
-arguments.
-Applications cannot create LSN's, and all LSN's provided to functions
-as arguments must first be retrieved using the
-.I put
-or
-.I seq
-functions.
-To provide a distinguished value for applications, it is guaranteed that
-no valid LSN will ever have a size of 0.
-.PP
-Applications can compare LSN's using the
-.I log_lsn_compare
-function (see below).
-.PP
-Applications can associate LSN's with specific log files.
-The function
-.I log_lsn_file
-(see below), returns the name of the log file containing the
-record with a specified LSN.
-(The mapping of LSN to file is needed for database administration.
-For example, a transaction manager typically records the earliest LSN
-needed for restart, and the database administrator may want to archive
-log files to tape when they contain only LSN's before the earliest one
-needed for restart.)
-.PP
-Applications can truncate the log file up to a specific LSN using the
-.I log_trunc
-function (see below).
-.PP
-The functions returned by
-.I db_open
-for the log access method are as described in
-.IR db_open ,
-with the following exceptions and additions:
-.TP 5
-type
-The type is DB_LOG.
-.TP 5
-del
-The
-.I del
-function always returns an error for the log-manager access method,
-setting
-.I errno
-to EINVAL.
-.TP 5
-int (*log_flush)(const DB *db, const DBT *lsn);
-The
-.I log_flush
-function flushes the log up to and including the log record
-.IR lsn .
-.RT log_flush
-.TP 5
-int (*log_lsn_compare)(const DB *,
-.ti +5
-const DBT *lsn1, const DBT *lsn2);
-A pointer to a function which is provided to permit applications to
-compare LSN's.
-The
-.I log_lsn_compare
-function returns an integer less than, equal to, or greater than zero
-if the first LSN is considered to be respectively less than, equal to,
-or greater than the second LSN.
-.TP 5
-int (*log_lsn_file)(const DB *db,
-.ti +5
-const DBT *lsn, char *name);
-.br
-The
-.I log_lsn_file
-function stores a pointer to the name of the file containing
-.I lsn
-in the address referenced by
-.IR name.
-This pointer is to an internal static object, and subsequent calls to
-the same function will modify the same object.
-.IP
-.RT log_lsn_file
-.TP 5
-int (*log_unlink)(const char *path, int force);
-The
-.I log_unlink
-function destroys the log represented by
-.IR path .
-If the
-.I force
-parameter is not set to 1 and there are other processes using the
-log, then
-.I log_unlink
-will return -1, setting
-.IR errno
-to EBUSY.
-If
-.I force is not set or there are no processes using the log, then all files
-used by the log are destroyed.
-.I log_unlink
-will return -1 on failure, setting
-.IR errno ,
-and 0 on success.
-.TP 5
-int (*log_trunc)(const DB *db, const DBT *lsn);
-The
-.I log_trunc
-function truncates the log up to an LSN which is less than
-.IR lsn .
-.RT log_trunc
-.TP 5
-put
-A log record containing
-.I data
-is appended to the log.
-Unlike the
-.I put
-functions for other access methods, the key parameter is not initialized
-by the application, instead, the LSN assigned to the data is returned in
-the
-.I key
-parameter.
-.IP
-The caller is responsible for providing any necessary structure to
-.I data .
-(For example, in a write-ahead logging protocol, the application must
-understand what part of
-.I data
-is an operation code, what part is redo information, and what part is
-undo information.
-In addition, most transaction managers will store in
-.I data
-the LSN of the previous log record for the same transaction,
-to support chaining back through the transaction's log records
-during undo.)
-.IP
-The parameter
-.I flag
-must be set to 0 or exactly one of the following values:
-.RS
-.TP 5
-R_CHECKPOINT
-Specify the key/data pair of the current call as the one to be returned
-when the
-.I seq
-function is next called with the R_CHECKPOINT flag.
-.TP 5
-R_FLUSH
-Flush immediately (ignoring any possibility for group commit).
-.RE
-.TP 5
-seq
-The
-.I seq
-function takes the following additional flag:
-.RS
-.TP 5
-R_CHECKPOINT
-The last key/data pair stored by the
-.I put
-function (using the R_CHECKPOINT flag) is returned,
-and the cursor is set or initialized to reference it.
-The expected use of this flag is during restart and to determine what
-part of the log must be available for restart.
-Therefore, the log record retrieved with R_CHECKPOINT should contain
-all the information that the transaction manager will need for this
-purpose.
-.RE
-.TP 5
-sync
-The
-.I sync
-function always returns an error for the log-manager access method,
-setting
-.I errno
-to EINVAL.
-.SH "SEE ALSO"
-.IR db_btree (3),
-.IR db_hash (3),
-.IR db_lock (3),
-.IR db_mpool (3),
-.IR db_open (3),
-.IR db_recno (3),
-.IR db_txn (3)
diff --git a/src/util/db2/man/db_mpool.3 b/src/util/db2/man/db_mpool.3
deleted file mode 100644
index 4b683b6185..0000000000
--- a/src/util/db2/man/db_mpool.3
+++ /dev/null
@@ -1,403 +0,0 @@
-.\" Copyright (c) 1990, 1993, 1994, 1995
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)db_mpool.3 8.14 (Berkeley) 8/1/95
-.\"
-.TH DB_MPOOL 3 "August 1, 1995"
-.UC 7
-.SH NAME
-db_mpool \- general purpose shared memory buffer pool
-.SH SYNOPSIS
-.nf
-.ft B
-#include <db.h>
-#include <mpool.h>
-
-int
-mpool_create(char *path, mode_t mode, size_t cachesize, u_long flags);
-
-MPOOL *
-mpool_open(char *path);
-
-int
-mpool_close(MPOOL *mp);
-
-MPOOLFILE *
-mpool_fopen(MPOOL *mp, char *path, size_t pagesize, void *pgcookie,
-.ti +5
-int (*pgin)(MPOOLFILE *mpf,
-.ti +8
-pgno_t pgno, void *pgaddr, void *pgcookie),
-.ti +5
-int (*pgout)(MPOOLFILE *mpf,
-.ti +8
-pgno_t pgno, void *pgaddr, void *pgcookie);
-
-int
-mpool_fclose(MPOOLFILE *mpf);
-
-void *
-mpool_get(MPOOLFILE *mpf, pgno_t *pgnoaddr, u_long flags,
-.ti +5
-int (*callback)(MPOOLFILE *mpf, pgno_t pgno));
-
-int
-mpool_put(MPOOLFILE *mpf, void *pgaddr, u_long flags);
-
-int
-mpool_sync(MPOOLFILE *mpf);
-
-int
-mpool_unlink(const char *path, int force);
-
-void
-mpool_stat(MPOOL *mp, FILE *fp);
-.ft R
-.fi
-.SH DESCRIPTION
-.so db.so
-.GN
-specific details of the memory pool interface.
-.PP
-The
-.I db_mpool
-function is the library interface intended to provide general-purpose,
-page-oriented buffer management of one or more files.
-While designed to work with the other DB functions, these functions are
-also useful for more general purposes.
-The memory pools (MPOOL's) are referred to in this document as
-simply ``pools''.
-Pools may be shared between processes.
-Pools are usually filled by pages from one or more files (MPOOLFILE's).
-Pages in the pool are replaced in LRU (least-recently-used) order,
-with each new page replacing the page which has been unused the longest.
-Pages retrieved from the pool using
-.I mpool_get
-are ``pinned'' in memory, by default,
-until they are returned to the pool using the
-.I mpool_put
-function.
-.PP
-.CR "memory pool" mpool
-.PP
-The
-.I cachesize
-argument specifies the size of the pool in bytes,
-and should be the size of the normal working set of the application with
-some small amount of additional memory for unusual situations.
-If the number of bytes currently ``pinned'' in memory exceeds
-.IR cachesize ,
-the
-.I db_mpool
-functions will attempt to allocate more memory and do not necessarily fail,
-although they may suffer performance degradation.
-.PP
-The
-.I flags
-argument is set by
-.IR or 'ing
-any of the following values:
-.TP
-MPOOL_PRIVATE
-The pool is not shared by other processes or threads,
-so no locking of pool resources is required.
-.PP
-.OP "memory pool" mpool
-.PP
-The
-.I mpool_close
-function closes the pool indicated by the MPOOL pointer
-.IR mp ,
-as returned by
-.IR mpool_open .
-This function does
-.B not
-imply a call to
-.I mpool_sync
-(or to
-.IR mpool_fclose )
-i.e. no pages are written to the source file as as a result of calling
-.IR mpool_close .
-.RT mpool_close
-.PP
-The function
-.I mpool_fopen
-opens a file for buffering in the pool specified by the MPOOL
-argument.
-The
-.I path
-argument is the name of the file to be opened.
-The
-.I pagesize
-argument is the size, in bytes, of the unit of transfer between the
-application and the pool, although not necessarily the unit of transfer
-between the pool and the source file.
-Applications not knowing the page size of the source file should
-retrieve the metadata from the file using a page size that is correct
-for the metadata, then close and reopen the file, or,
-otherwise determine the page size before calling
-.IR mpool_fopen .
-.PP
-If the
-.I pgin
-function is specified, it is called each time a page is read into
-the memory pool from the source file.
-If the
-.I pgout
-function is specified, it is called each time a page is written
-to the source file.
-Both functions are called with the MPOOLFILE pointer returned from
-.IR mpool_fopen ,
-the page number, a pointer to the page being read or written, and
-the argument
-.IR pgcookie .
-If either function fails, it should return non-zero and set
-.IR errno ,
-in which case the
-.I db_mpool
-function calling it will also fail, leaving
-.I errno
-intact.
-.PP
-The
-.I mpool_fclose
-function closes the source file indicated by the MPOOLFILE pointer
-.IR mpf .
-This function does
-.B not
-imply a call to
-.IR mpool_sync ,
-i.e. no pages are written to the source file as as a result of calling
-.IR mpool_fclose .
-.RT mpool_fclose
-.\"
-.\".PP
-.\"int
-.\"mpool_fd (MPOOLFILE *mpf);
-.\"
-.\".PP
-.\"The function
-.\".I mpool_fd
-.\"takes an MPOOLFILE pointer and returns the file descriptor being
-.\"used to read/write that file
-.\"to/from the pool.
-.PP
-The function
-.I mpool_get
-returns a pointer to the page with the page number specified by
-.IR pgnoaddr ,
-from the source file specified by the MPOOLFILE pointer
-.IR mpf .
-If the page does not exist or cannot be retrieved,
-.I mpool_get
-returns NULL and sets errno.
-.PP
-The
-.I flags
-argument is set by
-.IR or 'ing
-any of the following values:
-.TP 5
-MPOOL_CALLBACK
-After the page number has been determined, but before any other
-process or thread can access the page, the function specified by
-the
-.I callback
-argument is called.
-If the function fails, it should return non-zero and set
-.IR errno ,
-in which case
-.I mpool_get
-will also fail, leaving
-.I errno
-intact.
-The
-.I callback
-function is called with the MPOOLFILE pointer returned from
-.I mpool_fopen
-and the page number.
-This functionality is commonly used when page locking is required,
-but the page number of the page being retrieved is not known.
-.TP 5
-MPOOL_CREATE
-If the specified page does not exist, create it.
-.TP 5
-MPOOL_LAST
-Return the last page of the source file and copy its page number
-to the location referenced by
-.IR pgnoaddr .
-.TP 5
-MPOOL_NEW
-Create a new page in the file and copy its page number to the location
-referenced by
-.IR pgnoaddr .
-.TP 5
-MPOOL_NOPIN
-Don't pin the page into memory.
-(This flag is intended for debugging purposes, when it's often useful
-to examine pages which are currently held by other parts of the
-application.
-Pages retrieved in this manner don't need to be returned to the
-memory pool, i.e. they should
-.B not
-be specified as arguments to the
-.IR mpool_put
-routine.)
-.PP
-Created pages have all their bytes set to 0.
-.PP
-All pages returned by
-.I mpool_get
-(unless the MPOOL_NOPIN flag is specified),
-will be retained (i.e. ``pinned'') in the pool until a subsequent
-call to
-.IR mpool_put .
-.PP
-The function
-.I mpool_put
-indicates that the page referenced by
-.I pgaddr
-can be evicted from the pool.
-.I Pgaddr
-must be an address previously returned by
-.IR mpool_get .
-.PP
-The flag value is specified by
-.IR or 'ing
-any of the following values:
-.TP 5
-MPOOL_DIRTY
-The page has been modified and must be written to the source file
-before being evicted from the pool.
-.TP 5
-MPOOL_DISCARD
-The page is unlikely to be useful in the near future, and should be
-discarded before other pages in the pool.
-.PP
-.RT mpool_put
-.PP
-The function
-.I mpool_sync
-writes all pages associated with the MPOOLFILE pointer
-.IR mpf ,
-which were specified as arguments to the
-.I mpool_put
-function with an associated flag of
-MPOOL_DIRTY,
-to the source file.
-.RT mpool_sync
-.PP
-.UN "memory pool" mpool
-.PP
-The function
-.I mpool_stat
-writes statistics for the memory pool
-.I mp
-to the file specified by
-.IR fp .
-These statistics include the number of files participating in the pool,
-the active pages in the pool, and numbers as to how effective the cache
-has been.
-.SH ERRORS
-The
-.IR mpool_create ,
-.I mpool_open
-and
-.I mpool_fopen
-functions may fail and set
-.I errno
-for any of the errors specified for the library functions
-.IR open (2),
-.IR read (2),
-and
-.IR malloc (3).
-.PP
-The
-.I mpool_close
-and
-.I mpool_fclose
-functions may fail and set
-.I errno
-for any of the errors specified for the library functions
-.IR close (2)
-and
-.IR free (3).
-.PP
-The
-.I mpool_get
-function may fail and set
-.I errno
-for any of the errors specified for the library functions
-.IR read (2),
-.IR write (2),
-and
-.IR malloc (3)
-or the following:
-.TP 5
-[EINVAL]
-The requested page does not exist and MPOOL_CREATE was not set.
-.PP
-The
-.I mpool_put
-function may fail and set
-.I errno
-for any of the errors specified for the library function
-.IR write (2)
-or the following:
-.TP 5
-[EACCES]
-The source file was not opened for writing.
-.PP
-The
-.I mpool_sync
-function may fail and set
-.I errno
-for any of the errors specified for the library function
-.IR write (2).
-.PP
-The
-.I mpool_unlink
-function may fail and set
-.I errno
-for any of the errors specified for the library function
-.IR unlink (2)
-or the following:
-.TP 5
-[EBUSY]
-The memory pool was in use and the force flag was not set.
-.SH "SEE ALSO"
-.IR db_btree (3),
-.IR db_hash (3),
-.IR db_lock (3),
-.IR db_log (3),
-.IR db_open (3),
-.IR db_recno (3),
-.IR db_txn (3)
diff --git a/src/util/db2/man/db_open.3 b/src/util/db2/man/db_open.3
deleted file mode 100644
index f988ef9245..0000000000
--- a/src/util/db2/man/db_open.3
+++ /dev/null
@@ -1,574 +0,0 @@
-.\" Copyright (c) 1990, 1993, 1994, 1995
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)db_open.3 8.15 (Berkeley) 8/1/95
-.\"
-.TH DB_OPEN 3 "August 1, 1995"
-.UC 7
-.SH NAME
-db_open \- database access methods
-.SH SYNOPSIS
-.nf
-.ft B
-#include <db.h>
-
-DB *
-db_open(const char *file, int flags, int mode,
-.ti +5
-DBTYPE type, DBINFO *dbinfo, const void *openinfo);
-.ft R
-.fi
-.SH DESCRIPTION
-.so db.so
-.GN
-the overall structure of the available access methods.
-.PP
-The currently supported file formats are btree, hashed, log and recno
-(i.e. flat-file oriented).
-The btree format is a representation of a sorted, balanced tree structure.
-The hashed format is an extensible, dynamic hashing scheme.
-The log format is a general-purpose logging facility.
-The recno format is a byte stream file with fixed or variable length
-records.
-The formats and other, format specific information are described in detail
-in their respective manual pages:
-.IR db_btree (3),
-.IR db_hash (3),
-.IR db_log (3),
-and
-.IR db_recno (3).
-.PP
-Db_open opens
-.I file
-for reading and/or writing.
-Files never intended to be preserved on disk may be created by setting
-the file parameter to NULL.
-(Note, while most of the access methods use
-.I file
-as the name of an underlying file on disk, this is not guaranteed.
-See the manual pages for the individual access methods for more
-information.)
-.PP
-The
-.I flags
-and
-.I mode arguments
-are as specified to the
-.IR open (2)
-function, however, only the O_CREAT, O_EXCL, O_EXLOCK, O_NONBLOCK,
-O_RDONLY, O_RDWR, O_SHLOCK and O_TRUNC flags are meaningful.
-(Note, opening a database file O_WRONLY is not possible.)
-.\"Three additional options may be specified by
-.\".IR or 'ing
-.\"them into the
-.\".I flags
-.\"argument.
-.\".TP
-.\"DB_LOCK
-.\"Do the necessary locking in the database to support concurrent access.
-.\"If concurrent access isn't needed or the database is read-only this
-.\"flag should not be set, as it tends to have an associated performance
-.\"penalty.
-.\".TP
-.\"DB_SHMEM
-.\"Place the underlying memory pool used by the database in shared
-.\"memory.
-.\"Necessary for concurrent access.
-.\".TP
-.\"DB_TXN
-.\"Support transactions in the database.
-.\"The DB_LOCK and DB_SHMEM flags must be set as well.
-.PP
-The
-.I type
-argument is of type DBTYPE (as defined in the <db.h> include file) and
-may be set to DB_BTREE, DB_HASH, DB_LOG or DB_RECNO.
-.PP
-The
-.I dbinfo
-argument is a pointer to a structure containing references to locking,
-logging, transaction, and shared-memory buffer pool information.
-If
-.I dbinfo
-is NULL, then the access method may still use these subsystems,
-but the usage will be private to the application and managed by DB.
-If
-.I dbinfo
-is non-NULL,
-then the module referenced by each of the non-NULL fields is used by DB
-as necessary.
-The fields of the DBINFO structure are defined as follows:
-.TP 5
-const char *errpfx;
-A prefix to prepend to error messages; used only if
-.I errfile
-is non-NULL.
-.TP 5
-FILE *errfile;
-The
-.IR stdio (3)
-file stream to which error messages are logged.
-.sp
-When any error occurs in the
-.I db_open
-function, or in any function called using a field of the returned DB
-structure, an error value is returned by the function,
-and the global variable
-.I errno
-is set appropriately.
-In some cases, however, the
-.I errno
-value may be insufficient to describe the cause of the error.
-In these cases, if
-.I errfile
-is non-NULL, additional error information will be written to the file
-stream it represents, preceded by the string, if any, specified by
-.IR errpfx .
-This error logging facility should not be required for normal operation,
-but may be useful in debugging applications.
-.TP 5
-char *errbuf;
-The buffer to which error messages are copied.
-If non-NULL,
-.I errbuf
-behaves as described for
-.IR errfile ,
-except that the
-.I errpfx
-field is ignored and the error message is copied into the specified
-buffer instead of being written to the FILE stream.
-The DB routines assume that the associated buffer is at least 1024 bytes
-in length.
-.TP 5
-LOCK_TABLE_T *lockinfo;
-If locking is required for the file being opened (as in the case of
-buffers being maintained in a shared memory buffer pool),
-the
-.I lockinfo
-field contains a return value from the function
-.I lock_open
-that should be used
-(see
-.IR db_lock (3)).
-If
-.I lockinfo
-is NULL, no locking is done.
-.TP 5
-DB *loginfo;
-If modifications to the file being opened should be logged, the
-.I loginfo
-field contains a return value from the function
-.IR dbopen ,
-when opening a DB file of type DB_LOG.
-If
-.I loginfo
-is NULL, no logging is done.
-.TP 5
-MPOOL *mpoolinfo;
-If the cache for the file being opened should be maintained in a shared
-buffer pool, the
-.I mpoolinfo
-field contains a return value from the function
-.I mpool_open
-that should be used
-(see
-.IR db_mpool (3)).
-If
-.I mpoolinfo
-is NULL, a memory pool may still be created,
-but it will be private to the application and managed by DB.
-.TP 5
-TXNMGR *txninfo;
-If the accesses to the file being opened should take place in the context
-of transactions (providing atomicity and complete error recovery), the
-.I txninfo
-field contains a return value from the function
-.I txn_open
-(see
-.IR db_txn (3)).
-If transactions are specified,
-the application is responsible for making suitable calls to
-.IR txn_begin ,
-.IR txn_abort ,
-and
-.IR txn_commit .
-If
-.I txninfo
-is NULL, no transaction support is done.
-.PP
-The
-.I openinfo
-argument is a pointer to an access method specific structure described
-in the access method's manual page.
-If
-.I openinfo
-is NULL, each access method will use defaults appropriate for the system
-and the access method.
-.SH "KEY/DATA PAIRS"
-Access to all access methods is based on key/data pairs.
-Both keys and data are represented by the following data structure:
-.PP
-typedef struct {
-.RS
-void *data;
-.br
-size_t size;
-.RE
-} DBT;
-.PP
-The elements of the DBT structure are defined as follows:
-.TP 5
-data
-A pointer to a byte string.
-.ns
-.br
-.TP 5
-size
-The length of
-.IR data ,
-in bytes.
-.PP
-Key and data byte strings may reference strings of essentially unlimited
-length, although any two of them must fit into available memory at the
-same time.
-.PP
-The access methods provide no guarantees about byte string alignment,
-and applications are responsible for maintaining any necessary alignment.
-.SH "DB OPERATIONS"
-.I Db_open
-returns a pointer to a DB structure (as defined in the <db.h> include file)
-on success, and NULL on error.
-The DB structure describes a database type, and includes a set of functions
-to perform various actions, as described below.
-Each of these functions takes a pointer to a DB structure, and may take
-one or more DBT *'s and a flag value as well.
-Individual access methods specify additional functions and flags which
-are specific to the method.
-The fields of the DB structure are as follows:
-.TP 5
-DBTYPE type;
-The type of the underlying access method (and file format).
-.TP 5
-int (*close)(const DB *db);
-A pointer to a function to flush any cached information to disk,
-free any allocated resources, and close any underlying files.
-Since key/data pairs are cached in memory, failing to sync the
-file with the
-.I close
-or
-.I sync
-function may result in inconsistent or lost information.
-.IP
-The
-.I close
-functions return -1 on failure, setting
-.IR errno ,
-and 0 on success.
-.TP 5
-int (*del)(const DB *db, TXN *txnid,
-.ti +5
-const DBT *key, u_int flags);
-.br
-A pointer to a function to remove key/data pairs from the database.
-The key/data pair associated with the specified
-.I key
-are discarded from the database.
-.IP
-The
-.I txnid
-parameter contains a transaction ID returned from
-.IR txn_begin ,
-if the file is being accessed under transaction protection,
-or NULL if transactions are not in effect.
-.IP
-The parameter
-.I flag
-must be set to 0 or exactly one of the following values:
-.RS
-.TP 5
-R_CURSOR
-Delete the record referenced by the cursor.
-The cursor must have previously been initialized.
-.RE
-.IP
-The
-.I delete
-functions return -1 on error, setting
-.IR errno ,
-0 on success, and 1 if the specified
-.I key
-did not exist in the file.
-.TP 5
-int (*fd)(const DB *db);
-A pointer to a function which returns a file descriptor representative
-of the underlying database.
-A file descriptor referencing the same file will be returned to all
-processes which call
-.I db_open
-with the same
-.I file
-name.
-This file descriptor may be safely used as an argument to the
-.IR fcntl (2)
-and
-.IR flock (2)
-locking functions.
-The file descriptor is not necessarily associated with any of the
-underlying files used by the access method.
-No file descriptor is available for in memory databases.
-.IP
-The
-.I fd
-functions return -1 on error, setting
-.IR errno ,
-and the file descriptor on success.
-.TP 5
-int (*get)(const DB *db, TXN *txnid,
-.ti +5
-const DBT *key, DBT *data, u_int flags);
-.br
-A pointer to a function which is the interface for keyed retrieval from
-the database.
-The address and length of the data associated with the specified
-.I key
-are returned in the structure referenced by
-.IR data .
-.IP
-The
-.I txnid
-parameter contains a transaction ID returned from
-.IR txn_begin ,
-if the file is being accessed under transaction protection,
-or NULL if transactions are not in effect.
-.IP
-The
-.I get
-functions return -1 on error, setting
-.IR errno ,
-0 on success, and 1 if the
-.I key
-was not found.
-.TP 5
-int (*put)(const DB *db, TXN *txnid,
-.ti +5
-DBT *key, const DBT *data, u_int flags);
-.br
-A pointer to a function to store key/data pairs in the database.
-.IP
-The
-.I txnid
-parameter contains a transaction ID returned from
-.IR txn_begin ,
-if the file is being accessed under transaction protection,
-or NULL if transactions are not in effect.
-.IP
-The parameter
-.I flag
-must be set to 0 or exactly one of the following values:
-.RS
-.TP 5
-R_CURSOR
-Replace the key/data pair referenced by the cursor.
-The cursor must have previously been initialized.
-.TP 5
-R_NOOVERWRITE
-Enter the new key/data pair only if the key does not previously exist.
-.RE
-.IP
-The default behavior of the
-.I put
-functions is to enter the new key/data pair, replacing any previously
-existing key.
-.IP
-The
-.I put
-functions return -1 on error, setting
-.IR errno ,
-0 on success, and 1 if the R_NOOVERWRITE
-.I flag
-was set and the key already exists in the file.
-.TP 5
-int (*seq)(const DB *db, TXN *txnid,
-.ti +5
-DBT *key, DBT *data, u_int flags);
-.br
-A pointer to a function which is the interface for sequential
-retrieval from the database.
-The address and length of the key are returned in the structure
-referenced by
-.IR key ,
-and the address and length of the data are returned in the
-structure referenced
-by
-.IR data .
-.IP
-The
-.I txnid
-parameter contains a transaction ID returned from
-.IR txn_begin ,
-if the file is being accessed under transaction protection,
-or NULL if transactions are not in effect.
-.IP
-Sequential key/data pair retrieval may begin at any time, and the
-logical position of the ``cursor'' is not affected by calls to the
-.IR del ,
-.IR get ,
-.IR put ,
-or
-.I sync
-functions.
-Modifications to the database during a sequential scan will be reflected
-in the scan, i.e. records inserted behind the cursor will not be returned
-while records inserted in front of the cursor will be returned.
-.IP
-The parameter
-.I flag
-must be set to 0 or exactly one of the following values:
-.RS
-.TP 5
-R_CURSOR
-The data associated with the specified key is returned.
-This differs from the
-.I get
-functions in that it sets or initializes the cursor to the location of
-the key as well.
-.TP 5
-R_FIRST
-The first key/data pair of the database is returned, and the cursor
-is set or initialized to reference it.
-.TP 5
-R_NEXT
-Retrieve the key/data pair immediately after the cursor.
-If the cursor is not yet set, this is the same as the R_FIRST flag.
-.RE
-.IP
-The
-.I seq
-functions return -1 on error, setting
-.IR errno ,
-0 on success,
-and 1 if there are no key/data pairs less than or greater than the
-specified or current key.
-.TP 5
-int (*sync)(const DB *db, u_int flags);
-A pointer to a function to flush any cached information to disk.
-If the database is in memory only, the
-.I sync
-function has no effect and will always succeed.
-.IP
-The parameter
-.I flag
-must be set to 0 or a value specified by an access method specific
-manual page.
-.IP
-The
-.I sync
-functions return -1 on failure, setting
-.IR errno ,
-and 0 on success.
-.SH ERRORS
-The
-.I db_open
-function may fail and set
-.I errno
-for any of the errors specified for the library functions
-.IR open (2),
-.IR malloc (3)
-or the following:
-.TP 5
-[EFTYPE]
-A file is incorrectly formatted.
-.TP 5
-[EINVAL]
-A parameter has been specified (hash function, recno pad byte etc.)
-that is incompatible with the current file specification or, a flag
-to a function which is not meaningful for the function (for example,
-use of the cursor without prior initialization) or there is a mismatch
-between the version number of file and the software.
-.PP
-The
-.I close
-functions may fail and set
-.I errno
-for any of the errors specified for the library functions
-.IR close (2),
-.IR read (2),
-.IR write (2),
-.IR free (3),
-or
-.IR fsync (2).
-.PP
-The
-.IR del ,
-.IR get ,
-.I put
-and
-.I seq
-functions may fail and set
-.I errno
-for any of the errors specified for the library functions
-.IR read (2),
-.IR write (2),
-.IR free (3)
-or
-.IR malloc (3).
-.PP
-The
-.I fd
-functions will fail and set
-.I errno
-to ENOENT for in memory databases.
-.PP
-The
-.I sync
-functions may fail and set
-.I errno
-for any of the errors specified for the library function
-.IR fsync (2).
-.SH "SEE ALSO"
-.IR db_btree (3),
-.IR db_hash (3),
-.IR db_lock (3),
-.IR db_log (3),
-.IR db_mpool (3),
-.IR db_recno (3),
-.IR db_txn (3)
-.SH BUGS
-The name DBT is a mnemonic for ``data base thang'', and was used
-because noone could think of a reasonable name that wasn't already
-in use somewhere else.
-.PP
-The
-.I fd
-function interface is a kluge,
-and will be deleted in a future version of the interface.
-.PP
-Only big and little endian byte order is supported.
diff --git a/src/util/db2/man/db_recno.3 b/src/util/db2/man/db_recno.3
deleted file mode 100644
index 6b93b3f5a1..0000000000
--- a/src/util/db2/man/db_recno.3
+++ /dev/null
@@ -1,268 +0,0 @@
-.\" Copyright (c) 1990, 1993, 1994, 1995
-.\" The Regents of the University of California. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)db_recno.3 8.12 (Berkeley) 8/1/95
-.\"
-.TH DB_RECNO 3 "August 1, 1995"
-.UC 7
-.SH NAME
-db_recno \- record number database access method
-.SH DESCRIPTION
-.so db.so
-specific details of the recno access method.
-.SH "ACCESS METHOD SPECIFIC INFORMATION"
-The recno access method specific data structure provided to
-.I db_open
-is typedef'd and named RECNOINFO.
-A RECNOINFO structure has at least the following fields,
-which may be initialized before calling
-.IR db_open :
-.TP 5
-u_int8_t bval;
-The delimiting byte to be used to mark the end of a record for
-variable-length records, and the pad character for fixed-length
-records.
-If no value is specified, newlines (``\en'') are used to mark the end
-of variable-length records and fixed-length records are padded with
-spaces.
-.TP 5
-char *bfname;
-The recno access method stores the in-memory copies of its records
-in a btree.
-If bfname is non-NULL, it specifies the name of the btree file,
-as if specified as the file name for a
-.I db_open
-of a btree file.
-.TP 5
-u_int cachesize;
-A suggested maximum size, in bytes, of the memory cache.
-This value is
-.B only
-advisory, and the access method will allocate more memory rather than fail.
-If
-.I cachesize
-is 0 (no size is specified) a default size is used.
-.TP 5
-u_long flags;
-The flag value is specified by
-.IR or 'ing
-any of the following values:
-.RS
-.TP 5
-R_FIXEDLEN
-The records are fixed-length, not byte delimited.
-The structure element
-.I reclen
-specifies the length of the record, and the structure element
-.I bval
-is used as the pad character.
-Any records, inserted into the database, that are less than
-.I reclen
-bytes long are automatically padded.
-.TP 5
-R_NOKEY
-In the interface specified by
-.IR db_open ,
-the sequential record retrieval fills in both the caller's key and
-data structures.
-If the R_NOKEY flag is specified, the
-.I cursor
-functions are not required to fill in the key structure.
-This permits applications to retrieve records at the end of files without
-reading all of the intervening records.
-.TP 5
-R_SNAPSHOT
-This flag requires that a snapshot of the file be taken when
-.I db_open
-is called, instead of permitting any unmodified records to be read from
-the original file.
-.RE
-.TP 5
-int lorder;
-The byte order for integers in the stored database metadata.
-The number should represent the order as an integer; for example,
-big endian order would be the number 4,321.
-If
-.I lorder
-is 0 (no order is specified) the current host order is used.
-.TP 5
-u_int psize;
-The recno access method stores the in-memory copies of its records
-in a btree.
-This value is the size (in bytes) of the pages used for nodes in that tree.
-If
-.I psize
-is 0 (no page size is specified) a page size is chosen based on the
-underlying file system I/O block size.
-See
-.IR btree (3)
-for more information.
-.TP 5
-size_t reclen;
-The length of a fixed-length record.
-.SH "DB OPERATIONS"
-The data part of the key/data pair used by the recno access method
-is the same as other access methods.
-The key is different.
-The
-.I data
-field of the key should be a pointer to a memory location of type
-.IR recno_t ,
-as defined in the <db.h> include file.
-This type is normally the largest unsigned integral type available to
-the implementation.
-The
-.I size
-field of the key should be the size of that type.
-.PP
-The record number data structure is either variable or fixed-length
-records stored in a flat-file format, accessed by the logical record
-number.
-The existence of record number five requires the existence of records
-one through four, and the deletion of record number one causes
-record number five to be renumbered to record number four, as well
-as the cursor, if positioned after record number one, to shift down
-one record.
-The creation of record number five when records one through four do
-not exist causes the logical creation of them with zero-length data.
-.PP
-Because there is no meta-data associated with the underlying recno access
-method files, any changes made to the default values (e.g. fixed record
-length or byte separator value) must be explicitly specified each time the
-file is opened.
-.PP
-The functions returned by
-.I db_open
-for the btree access method are as described in
-.IR db_open (3),
-with the following exceptions and additions:
-.TP 5
-type
-The type is DB_RECNO.
-.TP 5
-put
-Using the
-.I put
-interface to create a new record will cause the creation of multiple,
-empty records if the record number is more than one greater than the
-largest record currently in the database.
-.IP
-The
-.I put
-function takes the following additional flags:
-.RS
-.TP 5
-R_IAFTER
-Append the data immediately after the data referenced by
-.IR key ,
-creating a new key/data pair.
-The record number of the appended key/data pair is returned in the
-.I key
-structure.
-.TP 5
-R_IBEFORE
-Insert the data immediately before the data referenced by
-.IR key ,
-creating a new key/data pair.
-The record number of the inserted key/data pair is returned in the
-.I key
-structure.
-.TP 5
-R_SETCURSOR
-Store the key/data pair, setting or initializing the position of the
-cursor to reference it.
-.RE
-.TP 5
-seq
-The
-.I seq
-function takes the following additional flags:
-.RS
-.TP 5
-R_LAST
-The last key/data pair of the database is returned, and the cursor
-is set or initialized to reference it.
-.TP 5
-R_PREV
-Retrieve the key/data pair immediately before the cursor.
-If the cursor is not yet set, this is the same as the R_LAST flag.
-.RE
-.IP
-If the database file is a character special file and no complete
-key/data pairs are currently available, the
-.I seq
-function returns 2.
-.TP 5
-sync
-The
-.I sync
-function takes the following additional flag:
-.RS
-.TP 5
-R_RECNOSYNC
-This flag causes the
-.I sync
-function to apply to the btree file which underlies the recno file,
-not the recno file itself.
-(See the
-.I bfname
-field of RECNOINFO
-structure, above, for more information.)
-.RE
-.SH ERRORS
-The
-.I recno
-access method functions may fail and set
-.I errno
-for any of the errors specified for the library function
-.IR db_open (3)
-or the following:
-.TP 5
-[EINVAL]
-An attempt was made to add a record to a fixed-length database that
-was too large to fit.
-.SH "SEE ALSO"
-.IR db_btree (3),
-.IR db_hash (3),
-.IR db_lock (3),
-.IR db_log (3),
-.IR db_mpool (3),
-.IR db_open (3),
-.IR db_txn (3)
-.sp
-.IR "Document Processing in a Relational Database System" ,
-Michael Stonebraker, Heidi Stettner, Joseph Kalash, Antonin Guttman,
-Nadene Lynn, Memorandum No. UCB/ERL M82/32, May 1982.
-.SH BUGS
-The
-.I sync
-function's R_RECNOSYNC interface is a kluge,
-and will be deleted in a future version of the interface.
diff --git a/src/util/db2/man/db_txn.3 b/src/util/db2/man/db_txn.3
deleted file mode 100644
index 18ad64692e..0000000000
--- a/src/util/db2/man/db_txn.3
+++ /dev/null
@@ -1,373 +0,0 @@
-.\" Copyright (c) 1994, 1995
-.\" The President and Fellows of Harvard University. All rights reserved.
-.\" Copyright (c) 1994, 1995
-.\" Margo I. Selzer. All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by the University of
-.\" California, Berkeley and its contributors.
-.\" 4. Neither the name of the University nor the names of its contributors
-.\" may be used to endorse or promote products derived from this software
-.\" without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" @(#)db_txn.3 8.8 (Harvard) 8/1/95
-.\"
-.TH DB_TXN 3 "August 1, 1995"
-.UC 7
-.SH NAME
-db_txn \- transaction management functions
-.SH SYNOPSIS
-.nf
-.ft B
-#include <db.h>
-#include <db_lock.h>
-
-int
-txn_create(const char *path, mode_t mode, u_int maxtxns, u_int flags);
-
-TXNMGR *
-txn_open(const char *path, DBT *logp, LOCK_TABLE_T *lockp,
-.ti +5
-int (*recover)(DBT *lsn, DBT *log_entry, int isundo));
-
-TXN *
-txn_begin(TXNMGR *txnp);
-
-int
-txn_commit(TXN *tid);
-
-int
-txn_prepare(TXN *tid);
-
-int
-txn_abort(TXN *tid);
-
-int
-txn_close(TXNMGR *txnp);
-
-int
-txn_unlink(const char *path, int force);
-.ft R
-.fi
-.SH DESCRIPTION
-.so db.so
-specific details of the transaction support.
-.PP
-.I Db_txn
-is the library interface that provides transaction semantics.
-Full transaction support is provided by a collection of modules
-that provide well defined interfaces to the services required for
-transaction processing.
-These services are recovery (see
-.IR db_log (3)),
-concurrency control (see
-.IR db_lock (3)),
-and the management of shared data (see
-.IR db_mpool (3)).
-Transaction semantics can be applied to the access methods described in
-.IR db (3)
-through function call parameters.
-.PP
-The model intended for transactional use (and that is used by the
-access methods) is that write-ahead logging is provided by
-.IR db_log (3)
-to record both before- and after-image logging.
-Locking follows a two-phase protocol and is implemented by
-.IR db_lock (3).
-.PP
-.CR "transaction region" txn
-Any necessary,
-associated log and lock regions are created as well (see
-.IR db_log (3)
-and
-.IR db_lock (3)).
-.PP
-The
-.I maxtxns
-argument specifies the maximum number of simultaneous transactions that
-are supported.
-This bounds the size of backing files and is used to derive limits for
-the size of the lock region and logfiles.
-When there are more than
-.I maxtxns
-concurrent transactions, calls to
-.I txn_begin
-may fail.
-.PP
-Default locking and logging protocols are provided only if the
-backing files exist.
-If the backing files do not exist, the
-.I flags
-parameter must indicate both a logging mode and locking mode specified by
-.IR or 'ing
-together at most one flag from each of the TXN_LOCK and TXN_LOG classes
-as follows:
-.TP 5
-TXN_LOCK_2PL
-Use two-phase locking.
-.TP 5
-TXN_LOCK_OPTIMISTIC
-Use optimistic locking (not currently implemented).
-.TP 5
-TXN_LOG_REDO
-Provide redo-only logging (not currently implemented).
-.TP 5
-TXN_LOG_UNDO
-Provide undo-only logging (not currently implemented).
-.TP 5
-TXN_LOG_UNDOREDO
-Provide undo/redo write-ahead logging.
-.PP
-.RT txn_create
-.PP
-.OP "transaction region" txn
-.PP
-The
-.I recover
-argument specifies a function that is called by
-.I txn_abort
-during transaction abort.
-This function takes three arguments:
-.TP 5
-lsn
-A log sequence number (LSN).
-.TP 5
-log_entry
-A log record.
-.TP 5
-isundo
-An undo flag set to 0 if the operation is a redo and set to 1 if the
-operation an undo.
-.PP
-As discussed in the
-.I db_log (3)
-manual page,
-the application is responsible for providing any necessary structure
-to the log record.
-For example, the application must understand what part of the log
-record is an operation code, what part is redo information, and what
-part is undo information.
-.PP
-The
-.I txn_begin
-function creates a new transaction in the designated transaction
-manager, returning a pointer to a TXN that uniquely identifies it.
-.PP
-The
-.I txn_commit
-function ends the transaction specified by the
-.I tid
-argument.
-Any locks held by the transaction are released.
-If logging is enabled, a commit log record is written and flushed to disk.
-.PP
-The
-.I txn_abort
-function causes an abnormal termination of the transaction.
-If logging is enabled, the log is played backwards and any recovery
-operations are initiated through the
-.I recover
-function specified to
-.IR txn_open .
-After recovery is completed, all locks held by the transaction are released.
-.PP
-The
-.I txn_close
-function detaches a process from the transaction environment specified
-by the TXNMGR pointer.
-All mapped regions are unmapped and any allocated resources are freed.
-Any uncommitted transactions are aborted.
-.PP
-.UN "transaction region" txn
-.PP
-The
-.I txn_prepare
-function initiates the beginning of a two phase commit.
-In a distributed transaction,
-the prepare directive should be issued to all participating
-transaction managers.
-Each manager must take whatever action is necessary to guarantee
-that a future call to
-.I txn_commit
-on the specified
-.I tid
-will succeed.
-.SH "SYSTEM INTEGRATION"
-This model can be applied to data bases other than the provided access
-methods.
-For example, consider an application that provides transaction semantics
-to data stored in regular files accessed using the
-.IR read (2)
-and
-.IR write (2)
-system calls.
-The operations for which transaction protection is desired are bracketed
-by calls to
-.I txn_begin
-and
-.IR txn_commit .
-.PP
-Before data are referenced, a call is made to the lock manager,
-.IR db_lock ,
-for a lock of the appropriate type (e.g. read)
-on the object being locked.
-The object might be a page in the file, a byte, a range of bytes,
-or some key.
-Before a write is performed, the application makes a call to the
-log manager,
-.IR db_log ,
-to record enough information to redo the operation in case of
-failure after commit and to undo the operation in case of abort.
-After the log message is written, the write system calls are issued.
-After all requests are issued, the application calls
-.IR txn_commit .
-When
-.I txn_commit
-returns, the caller is guaranteed that all necessary log writes have
-been written to disk.
-.PP
-At any time, the application may call
-.IR txn_abort ,
-which will result in the appropriate calls to the
-.I recover
-routine to restore the ``database'' to a consistent pre-transaction
-state.
-(The recover routine must be able to either reapply or undo the update
-depending on the context, for each different type of log record.)
-.PP
-If the application should crash, the recovery process uses the
-.I db_log
-interface to read the log and call the
-.I recover
-routine to restore the database to a consistent state.
-.PP
-The
-.I txn_prepare
-function provides the core functionality to implement distributed
-transactions,
-but it does not actually manage the notification of distributed
-transaction managers.
-The caller is responsible for issuing
-.I txn_prepare
-calls to all sites participating in the transaction.
-If all responses are positive, the caller can issue a
-.IR txn_commit .
-If any of the responses are negative, the caller should issue a
-.IR txn_abort .
-In general, the
-.I txn_prepare
-call requires that the transaction log be flushed to disk.
-.PP
-The structure of the transaction support allows application designers
-to trade off performance and protection.
-Since DB manages many structures in shared memory,
-its information is subject to corruption by applications when the library
-is linked directly with the application.
-For this reason, DB is designed to allow compilation into a separate
-server process that may be accessed via a socket interface.
-In this way DB's data structures are protected from application code,
-but communication overhead is increased.
-When applications are trusted, DB may be compiled directly into the
-application for increased performance.
-.SH ERRORS
-The
-.I txn_create
-function may fail and set
-.I errno
-for any of the errors specified for the library functions
-.IR open (2),
-.IR write (2),
-.IR malloc (3),
-.IR lock_create (3),
-and
-.IR log_create (3).
-.PP
-The
-.I txn_open
-function may fail and set
-.I errno
-to any of the errors specified for the library functions
-.IR open (2),
-.IR write (2),
-.IR malloc (3),
-.IR lock_open (3),
-and
-.IR log_open (3).
-.PP
-The
-.I txn_begin
-function may fail and set
-.I errno
-to ENOSPC indicating that the maximum number of concurrent
-transactions has been reached.
-.PP
-The
-.I txn_commit
-function may fail and set
-.I errno
-to EINVAL indicating that the transaction was aborted.
-.PP
-The
-.I txn_close
-function may fail and set
-.I errno
-to any of the errors specified for the library functions
-.IR close (2),
-.IR read (2),
-.IR write (2),
-.IR free (3),
-.IR fsync (2),
-.IR lock_close (3)
-or
-.IR log_close (3).
-.PP
-The
-.I txn_unlink
-function may fail and set
-.I errno
-to any of the errors specified for the library functions
-.IR unlink (2),
-.IR lock_unlink (3),
-and
-.IR log_unlink (3),
-or the following:
-.TP 5
-[EBUSY]
-The transaction region was in use and the force flag was not set.
-.SH "SEE ALSO"
-.IR db_btree (3),
-.IR db_hash (3),
-.IR db_lock (3),
-.IR db_log (3),
-.IR db_mpool (3),
-.IR db_open (3),
-.IR db_recno (3)
-.sp
-.IR "LIBTP: Portable, Modular Transactions for UNIX" ,
-Margo Seltzer, Michael Olson, USENIX proceedings, Winter 1992.
-.SH BUGS
-The
-.I maxtxns
-parameter is a kluge, and should be deleted in favor of dynamically
-expanding the transaction region.
diff --git a/src/util/db2/man/spell.ok b/src/util/db2/man/spell.ok
deleted file mode 100644
index 794b00bf87..0000000000
--- a/src/util/db2/man/spell.ok
+++ /dev/null
@@ -1,170 +0,0 @@
-Ake
-Antonin
-BTREE
-BTREEINFO
-Bsize
-CALLBACK
-Comput
-D.E
-DB
-DB's
-DBINFO
-DBT
-DBTYPE
-Db
-EACCES
-EBUSY
-EFTYPE
-EINVAL
-ENOENT
-ENOSPC
-ERL
-EXCL
-EXLOCK
-FIXEDLEN
-Ffactor
-Guttman
-HASHINFO
-Heidi
-IAFTER
-IBEFORE
-Kalash
-Knuth
-LIBTP
-LOGINFO
-LRU
-LSN
-LSN's
-MPOOL
-MPOOL's
-MPOOLFILE
-MPOOLFILE's
-Maxlocks
-Mpool
-NG
-NOKEY
-NOOVERWRITE
-NOPIN
-NOTHELD
-Nadene
-Nelem
-Nelems
-OBJ
-Pgaddr
-RDONLY
-RDWR
-RECNO
-RECNOINFO
-RECNOSYNC
-REQ
-SETCURSOR
-SHLOCK
-Stettner
-Stonebraker
-Surv
-TMPDIR
-TRUNC
-TXN
-TXNMGR
-Txn
-UCB
-UNDOREDO
-USENIX
-Unterauer
-Vol
-WAL
-WRONLY
-XACT
-YYYY.MM.DD.HH.SS
-al
-bfname
-bsize
-btree
-btrees
-bval
-cachesize
-callback
-const
-db
-db.h
-dbinfo
-dbopen
-del
-elistp
-endian
-enum
-errbuf
-errfile
-errno
-errpfx
-fd
-ffactor
-getv
-ing
-int
-int32
-int8
-isundo
-kluge
-lastlsn
-lg
-lock.h
-lockinfo
-lockop
-lockp
-log.YYYY.MM.DD.HH.MM.SS
-logfiles
-loginfo
-logp
-lreq
-lsn
-lsn1
-lsn2
-lt
-maxcache
-maxkeypage
-maxlocks
-maxtxns
-meta
-minkeypage
-mmap
-mpf
-mpool
-mpool.h
-mpoolinfo
-munmap
-nacquire
-nelem
-nelems
-nmodes
-noone
-nrelease
-obj
-op
-openinfo
-pathname
-pgaddr
-pgcookie
-pgin
-pgno
-pgnoaddr
-pgout
-pid
-pp
-psize
-queue.h
-reclen
-recno
-sx
-thang
-timespec
-tmp
-trunc
-txn
-txnid
-txninfo
-txnp
-typedef
-typedef'd
-vec
-writeable
diff --git a/src/util/db2/mpool/Makefile.in b/src/util/db2/mpool/Makefile.in
deleted file mode 100644
index 6f487ee6d2..0000000000
--- a/src/util/db2/mpool/Makefile.in
+++ /dev/null
@@ -1,11 +0,0 @@
-thisconfigdir=./..
-myfulldir=util/db2/mpool
-mydir=mpool
-BUILDTOP=$(REL)..$(S)..$(S)..
-STLIBOBJS=mpool.o
-
-LOCALINCLUDES= -I. -I$(srcdir)/../include -I../include -I$(srcdir)/../db
-
-all-unix:: all-libobjs
-clean-unix:: clean-libobjs
-# @libobj_frag@
diff --git a/src/util/db2/mpool/Makefile.inc b/src/util/db2/mpool/Makefile.inc
deleted file mode 100644
index 93210c89e2..0000000000
--- a/src/util/db2/mpool/Makefile.inc
+++ /dev/null
@@ -1,5 +0,0 @@
-# @(#)Makefile.inc 8.1 (Berkeley) 6/4/93
-
-.PATH: ${.CURDIR}/db/mpool
-
-SRCS+= mpool.c
diff --git a/src/util/db2/mpool/README b/src/util/db2/mpool/README
deleted file mode 100644
index 0f01fbcdb4..0000000000
--- a/src/util/db2/mpool/README
+++ /dev/null
@@ -1,7 +0,0 @@
-# @(#)README 8.1 (Berkeley) 6/4/93
-
-These are the current memory pool routines.
-They aren't ready for prime time, yet, and
-the interface is expected to change.
-
---keith
diff --git a/src/util/db2/mpool/mpool.c b/src/util/db2/mpool/mpool.c
deleted file mode 100644
index d172f71baa..0000000000
--- a/src/util/db2/mpool/mpool.c
+++ /dev/null
@@ -1,514 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)mpool.c 8.7 (Berkeley) 11/2/95";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/param.h>
-#include <sys/stat.h>
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "db-int.h"
-#include "mpool.h"
-
-static BKT *mpool_bkt __P((MPOOL *));
-static BKT *mpool_look __P((MPOOL *, db_pgno_t));
-static int mpool_write __P((MPOOL *, BKT *));
-
-/*
- * mpool_open --
- * Initialize a memory pool.
- */
-MPOOL *
-mpool_open(key, fd, pagesize, maxcache)
- void *key;
- int fd;
- db_pgno_t pagesize, maxcache;
-{
- struct stat sb;
- MPOOL *mp;
- int entry;
-
- /*
- * Get information about the file.
- *
- * XXX
- * We don't currently handle pipes, although we should.
- */
- if (fstat(fd, &sb))
- return (NULL);
- if (!S_ISREG(sb.st_mode)) {
- errno = ESPIPE;
- return (NULL);
- }
-
- /* Allocate and initialize the MPOOL cookie. */
- if ((mp = (MPOOL *)calloc(1, sizeof(MPOOL))) == NULL)
- return (NULL);
- CIRCLEQ_INIT(&mp->lqh);
- for (entry = 0; entry < HASHSIZE; ++entry)
- CIRCLEQ_INIT(&mp->hqh[entry]);
- mp->maxcache = maxcache;
- mp->npages = sb.st_size / pagesize;
- mp->pagesize = pagesize;
- mp->fd = fd;
- return (mp);
-}
-
-/*
- * mpool_filter --
- * Initialize input/output filters.
- */
-void
-mpool_filter(mp, pgin, pgout, pgcookie)
- MPOOL *mp;
- void (*pgin) __P((void *, db_pgno_t, void *));
- void (*pgout) __P((void *, db_pgno_t, void *));
- void *pgcookie;
-{
- mp->pgin = pgin;
- mp->pgout = pgout;
- mp->pgcookie = pgcookie;
-}
-
-/*
- * mpool_new --
- * Get a new page of memory.
- */
-void *
-mpool_new(mp, pgnoaddr, flags)
- MPOOL *mp;
- db_pgno_t *pgnoaddr;
- u_int flags;
-{
- struct _hqh *head;
- BKT *bp;
-
- if (mp->npages == MAX_PAGE_NUMBER) {
- (void)fprintf(stderr, "mpool_new: page allocation overflow.\n");
- abort();
- }
-#ifdef STATISTICS
- ++mp->pagenew;
-#endif
- /*
- * Get a BKT from the cache. Assign a new page number, attach
- * it to the head of the hash chain, the tail of the lru chain,
- * and return.
- */
- if ((bp = mpool_bkt(mp)) == NULL)
- return (NULL);
- if (flags == MPOOL_PAGE_REQUEST) {
- mp->npages++;
- bp->pgno = *pgnoaddr;
- } else
- bp->pgno = *pgnoaddr = mp->npages++;
-
- bp->flags = MPOOL_PINNED | MPOOL_INUSE;
-
- head = &mp->hqh[HASHKEY(bp->pgno)];
- CIRCLEQ_INSERT_HEAD(head, bp, hq);
- CIRCLEQ_INSERT_TAIL(&mp->lqh, bp, q);
- return (bp->page);
-}
-
-int
-mpool_delete(mp, page)
- MPOOL *mp;
- void *page;
-{
- struct _hqh *head;
- BKT *bp;
-
- bp = (BKT *)((char *)page - sizeof(BKT));
-
-#ifdef DEBUG
- if (!(bp->flags & MPOOL_PINNED)) {
- (void)fprintf(stderr,
- "mpool_delete: page %d not pinned\n", bp->pgno);
- abort();
- }
-#endif
-
- /* Remove from the hash and lru queues. */
- head = &mp->hqh[HASHKEY(bp->pgno)];
- CIRCLEQ_REMOVE(head, bp, hq);
- CIRCLEQ_REMOVE(&mp->lqh, bp, q);
-
- free(bp);
- return (RET_SUCCESS);
-}
-
-/*
- * mpool_get
- * Get a page.
- */
-void *
-mpool_get(mp, pgno, flags)
- MPOOL *mp;
- db_pgno_t pgno;
- u_int flags; /* XXX not used? */
-{
- struct _hqh *head;
- BKT *bp;
- off_t off;
- int nr;
-
-#ifdef STATISTICS
- ++mp->pageget;
-#endif
-
- /* Check for a page that is cached. */
- if ((bp = mpool_look(mp, pgno)) != NULL) {
-#ifdef DEBUG
- if (!(flags & MPOOL_IGNOREPIN) && bp->flags & MPOOL_PINNED) {
- (void)fprintf(stderr,
- "mpool_get: page %d already pinned\n", bp->pgno);
- abort();
- }
-#endif
- /*
- * Move the page to the head of the hash chain and the tail
- * of the lru chain.
- */
- head = &mp->hqh[HASHKEY(bp->pgno)];
- CIRCLEQ_REMOVE(head, bp, hq);
- CIRCLEQ_INSERT_HEAD(head, bp, hq);
- CIRCLEQ_REMOVE(&mp->lqh, bp, q);
- CIRCLEQ_INSERT_TAIL(&mp->lqh, bp, q);
-
- /* Return a pinned page. */
- bp->flags |= MPOOL_PINNED;
- return (bp->page);
- }
-
- /* Get a page from the cache. */
- if ((bp = mpool_bkt(mp)) == NULL)
- return (NULL);
-
- /* Read in the contents. */
-#ifdef STATISTICS
- ++mp->pageread;
-#endif
- off = mp->pagesize * pgno;
- if (off / mp->pagesize != pgno) {
- /* Run past the end of the file, or at least the part we
- can address without large-file support? */
- errno = E2BIG;
- return NULL;
- }
- if (lseek(mp->fd, off, SEEK_SET) != off)
- return (NULL);
-
- if ((nr = read(mp->fd, bp->page, mp->pagesize)) != mp->pagesize) {
- if (nr > 0) {
- /* A partial read is definitely bad. */
- errno = EINVAL;
- return (NULL);
- } else {
- /*
- * A zero-length reads, means you need to create a
- * new page.
- */
- memset(bp->page, 0, mp->pagesize);
- }
- }
-
- /* Set the page number, pin the page. */
- bp->pgno = pgno;
- if (!(flags & MPOOL_IGNOREPIN))
- bp->flags = MPOOL_PINNED;
- bp->flags |= MPOOL_INUSE;
-
- /*
- * Add the page to the head of the hash chain and the tail
- * of the lru chain.
- */
- head = &mp->hqh[HASHKEY(bp->pgno)];
- CIRCLEQ_INSERT_HEAD(head, bp, hq);
- CIRCLEQ_INSERT_TAIL(&mp->lqh, bp, q);
-
- /* Run through the user's filter. */
- if (mp->pgin != NULL)
- (mp->pgin)(mp->pgcookie, bp->pgno, bp->page);
-
- return (bp->page);
-}
-
-/*
- * mpool_put
- * Return a page.
- */
-int
-mpool_put(mp, page, flags)
- MPOOL *mp;
- void *page;
- u_int flags;
-{
- BKT *bp;
-
-#ifdef STATISTICS
- ++mp->pageput;
-#endif
- bp = (BKT *)((char *)page - sizeof(BKT));
-#ifdef DEBUG
- if (!(bp->flags & MPOOL_PINNED)) {
- (void)fprintf(stderr,
- "mpool_put: page %d not pinned\n", bp->pgno);
- abort();
- }
-#endif
- bp->flags &= ~MPOOL_PINNED;
- if (flags & MPOOL_DIRTY)
- bp->flags |= flags & MPOOL_DIRTY;
- return (RET_SUCCESS);
-}
-
-/*
- * mpool_close
- * Close the buffer pool.
- */
-int
-mpool_close(mp)
- MPOOL *mp;
-{
- BKT *bp;
-
- /* Free up any space allocated to the lru pages. */
- while ((bp = mp->lqh.cqh_first) != (void *)&mp->lqh) {
- CIRCLEQ_REMOVE(&mp->lqh, mp->lqh.cqh_first, q);
- free(bp);
- }
-
- /* Free the MPOOL cookie. */
- free(mp);
- return (RET_SUCCESS);
-}
-
-/*
- * mpool_sync
- * Sync the pool to disk.
- */
-int
-mpool_sync(mp)
- MPOOL *mp;
-{
- BKT *bp;
-
- /* Walk the lru chain, flushing any dirty pages to disk. */
- for (bp = mp->lqh.cqh_first;
- bp != (void *)&mp->lqh; bp = bp->q.cqe_next)
- if (bp->flags & MPOOL_DIRTY &&
- mpool_write(mp, bp) == RET_ERROR)
- return (RET_ERROR);
-
- /* Sync the file descriptor. */
- return (fsync(mp->fd) ? RET_ERROR : RET_SUCCESS);
-}
-
-/*
- * mpool_bkt
- * Get a page from the cache (or create one).
- */
-static BKT *
-mpool_bkt(mp)
- MPOOL *mp;
-{
- struct _hqh *head;
- BKT *bp;
-
- /* If under the max cached, always create a new page. */
- if (mp->curcache < mp->maxcache)
- goto new;
-
- /*
- * If the cache is max'd out, walk the lru list for a buffer we
- * can flush. If we find one, write it (if necessary) and take it
- * off any lists. If we don't find anything we grow the cache anyway.
- * The cache never shrinks.
- */
- for (bp = mp->lqh.cqh_first;
- bp != (void *)&mp->lqh; bp = bp->q.cqe_next)
- if (!(bp->flags & MPOOL_PINNED)) {
- /* Flush if dirty. */
- if (bp->flags & MPOOL_DIRTY &&
- mpool_write(mp, bp) == RET_ERROR)
- return (NULL);
-#ifdef STATISTICS
- ++mp->pageflush;
-#endif
- /* Remove from the hash and lru queues. */
- head = &mp->hqh[HASHKEY(bp->pgno)];
- CIRCLEQ_REMOVE(head, bp, hq);
- CIRCLEQ_REMOVE(&mp->lqh, bp, q);
-#ifdef DEBUG
- { void *spage;
- spage = bp->page;
- memset(bp, 0xff, sizeof(BKT) + mp->pagesize);
- bp->page = spage;
- }
-#endif
- bp->flags = 0;
- return (bp);
- }
-
-new: if ((bp = (BKT *)malloc(sizeof(BKT) + mp->pagesize)) == NULL)
- return (NULL);
-#ifdef STATISTICS
- ++mp->pagealloc;
-#endif
-#if defined(DEBUG) || defined(PURIFY)
- memset(bp, 0xff, sizeof(BKT) + mp->pagesize);
-#endif
- bp->page = (char *)bp + sizeof(BKT);
- bp->flags = 0;
- ++mp->curcache;
- return (bp);
-}
-
-/*
- * mpool_write
- * Write a page to disk.
- */
-static int
-mpool_write(mp, bp)
- MPOOL *mp;
- BKT *bp;
-{
- off_t off;
-
-#ifdef STATISTICS
- ++mp->pagewrite;
-#endif
-
- /* Run through the user's filter. */
- if (mp->pgout)
- (mp->pgout)(mp->pgcookie, bp->pgno, bp->page);
-
- off = mp->pagesize * bp->pgno;
- if (off / mp->pagesize != bp->pgno) {
- /* Run past the end of the file, or at least the part we
- can address without large-file support? */
- errno = E2BIG;
- return RET_ERROR;
- }
- if (lseek(mp->fd, off, SEEK_SET) != off)
- return (RET_ERROR);
- if (write(mp->fd, bp->page, mp->pagesize) != mp->pagesize)
- return (RET_ERROR);
-
- bp->flags &= ~MPOOL_DIRTY;
- return (RET_SUCCESS);
-}
-
-/*
- * mpool_look
- * Lookup a page in the cache.
- */
-static BKT *
-mpool_look(mp, pgno)
- MPOOL *mp;
- db_pgno_t pgno;
-{
- struct _hqh *head;
- BKT *bp;
-
- head = &mp->hqh[HASHKEY(pgno)];
- for (bp = head->cqh_first; bp != (void *)head; bp = bp->hq.cqe_next)
- if ((bp->pgno == pgno) &&
- (bp->flags & MPOOL_INUSE == MPOOL_INUSE)) {
-#ifdef STATISTICS
- ++mp->cachehit;
-#endif
- return (bp);
- }
-#ifdef STATISTICS
- ++mp->cachemiss;
-#endif
- return (NULL);
-}
-
-#ifdef STATISTICS
-/*
- * mpool_stat
- * Print out cache statistics.
- */
-void
-mpool_stat(mp)
- MPOOL *mp;
-{
- BKT *bp;
- int cnt;
- char *sep;
-
- (void)fprintf(stderr, "%lu pages in the file\n", mp->npages);
- (void)fprintf(stderr,
- "page size %lu, cacheing %lu pages of %lu page max cache\n",
- mp->pagesize, mp->curcache, mp->maxcache);
- (void)fprintf(stderr, "%lu page puts, %lu page gets, %lu page new\n",
- mp->pageput, mp->pageget, mp->pagenew);
- (void)fprintf(stderr, "%lu page allocs, %lu page flushes\n",
- mp->pagealloc, mp->pageflush);
- if (mp->cachehit + mp->cachemiss)
- (void)fprintf(stderr,
- "%.0f%% cache hit rate (%lu hits, %lu misses)\n",
- ((double)mp->cachehit / (mp->cachehit + mp->cachemiss))
- * 100, mp->cachehit, mp->cachemiss);
- (void)fprintf(stderr, "%lu page reads, %lu page writes\n",
- mp->pageread, mp->pagewrite);
-
- sep = "";
- cnt = 0;
- for (bp = mp->lqh.cqh_first;
- bp != (void *)&mp->lqh; bp = bp->q.cqe_next) {
- (void)fprintf(stderr, "%s%d", sep, bp->pgno);
- if (bp->flags & MPOOL_DIRTY)
- (void)fprintf(stderr, "d");
- if (bp->flags & MPOOL_PINNED)
- (void)fprintf(stderr, "P");
- if (++cnt == 10) {
- sep = "\n";
- cnt = 0;
- } else
- sep = ", ";
-
- }
- (void)fprintf(stderr, "\n");
-}
-#endif
diff --git a/src/util/db2/mpool/mpool.h b/src/util/db2/mpool/mpool.h
deleted file mode 100644
index 627ad5b368..0000000000
--- a/src/util/db2/mpool/mpool.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)mpool.h 8.4 (Berkeley) 11/2/95
- */
-
-#include "db-queue.h"
-
-/*
- * The memory pool scheme is a simple one. Each in-memory page is referenced
- * by a bucket which is threaded in up to two of three ways. All active pages
- * are threaded on a hash chain (hashed by page number) and an lru chain.
- * Inactive pages are threaded on a free chain. Each reference to a memory
- * pool is handed an opaque MPOOL cookie which stores all of this information.
- */
-#define HASHSIZE 128
-#define HASHKEY(pgno) ((pgno - 1) % HASHSIZE)
-
-/* The BKT structures are the elements of the queues. */
-typedef struct _bkt {
- CIRCLEQ_ENTRY(_bkt) hq; /* hash queue */
- CIRCLEQ_ENTRY(_bkt) q; /* lru queue */
- void *page; /* page */
- db_pgno_t pgno; /* page number */
-
-#define MPOOL_DIRTY 0x01 /* page needs to be written */
-#define MPOOL_PINNED 0x02 /* page is pinned into memory */
-#define MPOOL_INUSE 0x04 /* page address is valid */
- u_int8_t flags; /* flags */
-} BKT;
-
-typedef struct MPOOL {
- CIRCLEQ_HEAD(_lqh, _bkt) lqh; /* lru queue head */
- /* hash queue array */
- CIRCLEQ_HEAD(_hqh, _bkt) hqh[HASHSIZE];
- db_pgno_t curcache; /* current number of cached pages */
- db_pgno_t maxcache; /* max number of cached pages */
- db_pgno_t npages; /* number of pages in the file */
- u_long pagesize; /* file page size */
- int fd; /* file descriptor */
- /* page in conversion routine */
- void (*pgin) __P((void *, db_pgno_t, void *));
- /* page out conversion routine */
- void (*pgout) __P((void *, db_pgno_t, void *));
- void *pgcookie; /* cookie for page in/out routines */
-#ifdef STATISTICS
- u_long cachehit;
- u_long cachemiss;
- u_long pagealloc;
- u_long pageflush;
- u_long pageget;
- u_long pagenew;
- u_long pageput;
- u_long pageread;
- u_long pagewrite;
-#endif
-} MPOOL;
-
-#define MPOOL_IGNOREPIN 0x01 /* Ignore if the page is pinned. */
-#define MPOOL_PAGE_REQUEST 0x01 /* Allocate a new page with a
- specific page number. */
-#define MPOOL_PAGE_NEXT 0x02 /* Allocate a new page with the next
- page number. */
-
-#define mpool_open kdb2_mpool_open
-#define mpool_filter kdb2_mpool_filter
-#define mpool_new kdb2_mpool_new
-#define mpool_get kdb2_mpool_get
-#define mpool_delete kdb2_mpool_delete
-#define mpool_put kdb2_mpool_put
-#define mpool_sync kdb2_mpool_sync
-#define mpool_close kdb2_mpool_close
-#define mpool_stat kdb2_mpool_stat
-
-__BEGIN_DECLS
-MPOOL *mpool_open __P((void *, int, db_pgno_t, db_pgno_t));
-void mpool_filter __P((MPOOL *, void (*)(void *, db_pgno_t, void *),
- void (*)(void *, db_pgno_t, void *), void *));
-void *mpool_new __P((MPOOL *, db_pgno_t *, u_int));
-void *mpool_get __P((MPOOL *, db_pgno_t, u_int));
-int mpool_delete __P((MPOOL *, void *));
-int mpool_put __P((MPOOL *, void *, u_int));
-int mpool_sync __P((MPOOL *));
-int mpool_close __P((MPOOL *));
-#ifdef STATISTICS
-void mpool_stat __P((MPOOL *));
-#endif
-__END_DECLS
diff --git a/src/util/db2/recno/Makefile.in b/src/util/db2/recno/Makefile.in
deleted file mode 100644
index 6726227c67..0000000000
--- a/src/util/db2/recno/Makefile.in
+++ /dev/null
@@ -1,13 +0,0 @@
-thisconfigdir=./..
-myfulldir=util/db2/recno
-mydir=recno
-BUILDTOP=$(REL)..$(S)..$(S)..
-STLIBOBJS= rec_close.o rec_delete.o rec_get.o rec_open.o rec_put.o \
- rec_search.o rec_seq.o rec_utils.o
-
-LOCALINCLUDES= -I. -I$(srcdir)/../include -I../include -I$(srcdir)/../mpool \
- -I$(srcdir)/../db
-
-all-unix:: all-libobjs
-clean-unix:: clean-libobjs
-# @libobj_frag@
diff --git a/src/util/db2/recno/Makefile.inc b/src/util/db2/recno/Makefile.inc
deleted file mode 100644
index e49e225522..0000000000
--- a/src/util/db2/recno/Makefile.inc
+++ /dev/null
@@ -1,6 +0,0 @@
-# @(#)Makefile.inc 8.1 (Berkeley) 6/4/93
-
-.PATH: ${.CURDIR}/db/recno
-
-SRCS+= rec_close.c rec_delete.c rec_get.c rec_open.c rec_put.c rec_search.c \
- rec_seq.c rec_utils.c
diff --git a/src/util/db2/recno/extern.h b/src/util/db2/recno/extern.h
deleted file mode 100644
index 98e382c37e..0000000000
--- a/src/util/db2/recno/extern.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)extern.h 8.3 (Berkeley) 6/4/94
- */
-
-#include "../btree/extern.h"
-
-#define __rec_close __kdb2_rec_close
-#define __rec_delete __kdb2_rec_delete
-#define __rec_dleaf __kdb2_rec_dleaf
-#define __rec_fd __kdb2_rec_fd
-#define __rec_fmap __kdb2_rec_fmap
-#define __rec_fout __kdb2_rec_fout
-#define __rec_fpipe __kdb2_rec_fpipe
-#define __rec_get __kdb2_rec_get
-#define __rec_iput __kdb2_rec_iput
-#define __rec_put __kdb2_rec_put
-#define __rec_ret __kdb2_rec_ret
-#define __rec_search __kdb2_rec_search
-#define __rec_seq __kdb2_rec_seq
-#define __rec_sync __kdb2_rec_sync
-#define __rec_vmap __kdb2_rec_vmap
-#define __rec_vout __kdb2_rec_vout
-#define __rec_vpipe __kdb2_rec_vpipe
-
-int __rec_close __P((DB *));
-int __rec_delete __P((const DB *, const DBT *, u_int));
-int __rec_dleaf __P((BTREE *, PAGE *, u_int32_t));
-int __rec_fd __P((const DB *));
-int __rec_fmap __P((BTREE *, recno_t));
-int __rec_fout __P((BTREE *));
-int __rec_fpipe __P((BTREE *, recno_t));
-int __rec_get __P((const DB *, const DBT *, DBT *, u_int));
-int __rec_iput __P((BTREE *, recno_t, const DBT *, u_int));
-int __rec_put __P((const DB *dbp, DBT *, const DBT *, u_int));
-int __rec_ret __P((BTREE *, EPG *, recno_t, DBT *, DBT *));
-EPG *__rec_search __P((BTREE *, recno_t, enum SRCHOP));
-int __rec_seq __P((const DB *, DBT *, DBT *, u_int));
-int __rec_sync __P((const DB *, u_int));
-int __rec_vmap __P((BTREE *, recno_t));
-int __rec_vout __P((BTREE *));
-int __rec_vpipe __P((BTREE *, recno_t));
diff --git a/src/util/db2/recno/rec_close.c b/src/util/db2/recno/rec_close.c
deleted file mode 100644
index ed3da6ea42..0000000000
--- a/src/util/db2/recno/rec_close.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)rec_close.c 8.9 (Berkeley) 11/18/94";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-#include <sys/uio.h>
-#ifdef RECNO_USE_MMAP
-#include <sys/mman.h>
-#endif
-
-#include <errno.h>
-#include <limits.h>
-#include <stdio.h>
-#include <unistd.h>
-
-#include "db-int.h"
-#include "recno.h"
-
-/*
- * __REC_CLOSE -- Close a recno tree.
- *
- * Parameters:
- * dbp: pointer to access method
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS
- */
-int
-__rec_close(dbp)
- DB *dbp;
-{
- BTREE *t;
- int status;
-
- t = dbp->internal;
-
- /* Toss any page pinned across calls. */
- if (t->bt_pinned != NULL) {
- mpool_put(t->bt_mp, t->bt_pinned, 0);
- t->bt_pinned = NULL;
- }
-
- if (__rec_sync(dbp, 0) == RET_ERROR)
- return (RET_ERROR);
-
- /* Committed to closing. */
- status = RET_SUCCESS;
-#ifdef RECNO_USE_MMAP
- if (F_ISSET(t, R_MEMMAPPED) && munmap(t->bt_smap, t->bt_msize))
- status = RET_ERROR;
-#endif
-
- if (!F_ISSET(t, R_INMEM)) {
- if (F_ISSET(t, R_CLOSEFP)) {
- if (fclose(t->bt_rfp))
- status = RET_ERROR;
- } else
- if (close(t->bt_rfd))
- status = RET_ERROR;
- }
-
- if (__bt_close(dbp) == RET_ERROR)
- status = RET_ERROR;
-
- return (status);
-}
-
-/*
- * __REC_SYNC -- sync the recno tree to disk.
- *
- * Parameters:
- * dbp: pointer to access method
- *
- * Returns:
- * RET_SUCCESS, RET_ERROR.
- */
-int
-__rec_sync(dbp, flags)
- const DB *dbp;
- u_int flags;
-{
- struct iovec iov[2];
- BTREE *t;
- DBT data, key;
- off_t off;
- recno_t scursor, trec;
- int status;
-
- t = dbp->internal;
-
- /* Toss any page pinned across calls. */
- if (t->bt_pinned != NULL) {
- mpool_put(t->bt_mp, t->bt_pinned, 0);
- t->bt_pinned = NULL;
- }
-
- if (flags == R_RECNOSYNC)
- return (__bt_sync(dbp, 0));
-
- if (F_ISSET(t, R_RDONLY | R_INMEM) || !F_ISSET(t, R_MODIFIED))
- return (RET_SUCCESS);
-
- /* Read any remaining records into the tree. */
- if (!F_ISSET(t, R_EOF) && t->bt_irec(t, MAX_REC_NUMBER) == RET_ERROR)
- return (RET_ERROR);
-
- /* Rewind the file descriptor. */
- if (lseek(t->bt_rfd, (off_t)0, SEEK_SET) != 0)
- return (RET_ERROR);
-
- /* Save the cursor. */
- scursor = t->bt_cursor.rcursor;
-
- key.size = sizeof(recno_t);
- key.data = &trec;
-
- if (F_ISSET(t, R_FIXLEN)) {
- /*
- * We assume that fixed length records are all fixed length.
- * Any that aren't are either EINVAL'd or corrected by the
- * record put code.
- */
- status = (dbp->seq)(dbp, &key, &data, R_FIRST);
- while (status == RET_SUCCESS) {
- if (write(t->bt_rfd, data.data, data.size) != data.size)
- return (RET_ERROR);
- status = (dbp->seq)(dbp, &key, &data, R_NEXT);
- }
- } else {
- iov[1].iov_base = &t->bt_bval;
- iov[1].iov_len = 1;
-
- status = (dbp->seq)(dbp, &key, &data, R_FIRST);
- while (status == RET_SUCCESS) {
- iov[0].iov_base = data.data;
- iov[0].iov_len = data.size;
- if (writev(t->bt_rfd, iov, 2) != data.size + 1)
- return (RET_ERROR);
- status = (dbp->seq)(dbp, &key, &data, R_NEXT);
- }
- }
-
- /* Restore the cursor. */
- t->bt_cursor.rcursor = scursor;
-
- if (status == RET_ERROR)
- return (RET_ERROR);
- if ((off = lseek(t->bt_rfd, (off_t)0, SEEK_CUR)) == -1)
- return (RET_ERROR);
- if (ftruncate(t->bt_rfd, off))
- return (RET_ERROR);
- F_CLR(t, R_MODIFIED);
- return (RET_SUCCESS);
-}
diff --git a/src/util/db2/recno/rec_delete.c b/src/util/db2/recno/rec_delete.c
deleted file mode 100644
index b69c9ad742..0000000000
--- a/src/util/db2/recno/rec_delete.c
+++ /dev/null
@@ -1,197 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Mike Olson.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)rec_delete.c 8.7 (Berkeley) 7/14/94";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "db-int.h"
-#include "recno.h"
-
-static int rec_rdelete __P((BTREE *, recno_t));
-
-/*
- * __REC_DELETE -- Delete the item(s) referenced by a key.
- *
- * Parameters:
- * dbp: pointer to access method
- * key: key to delete
- * flags: R_CURSOR if deleting what the cursor references
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS and RET_SPECIAL if the key not found.
- */
-int
-__rec_delete(dbp, key, flags)
- const DB *dbp;
- const DBT *key;
- u_int flags;
-{
- BTREE *t;
- recno_t nrec;
- int status;
-
- t = dbp->internal;
-
- /* Toss any page pinned across calls. */
- if (t->bt_pinned != NULL) {
- mpool_put(t->bt_mp, t->bt_pinned, 0);
- t->bt_pinned = NULL;
- }
-
- switch(flags) {
- case 0:
- if ((nrec = *(recno_t *)key->data) == 0)
- goto einval;
- if (nrec > t->bt_nrecs)
- return (RET_SPECIAL);
- --nrec;
- status = rec_rdelete(t, nrec);
- break;
- case R_CURSOR:
- if (!F_ISSET(&t->bt_cursor, CURS_INIT))
- goto einval;
- if (t->bt_nrecs == 0)
- return (RET_SPECIAL);
- status = rec_rdelete(t, t->bt_cursor.rcursor - 1);
- if (status == RET_SUCCESS)
- --t->bt_cursor.rcursor;
- break;
- default:
-einval: errno = EINVAL;
- return (RET_ERROR);
- }
-
- if (status == RET_SUCCESS)
- F_SET(t, B_MODIFIED | R_MODIFIED);
- return (status);
-}
-
-/*
- * REC_RDELETE -- Delete the data matching the specified key.
- *
- * Parameters:
- * tree: tree
- * nrec: record to delete
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS and RET_SPECIAL if the key not found.
- */
-static int
-rec_rdelete(t, nrec)
- BTREE *t;
- recno_t nrec;
-{
- EPG *e;
- PAGE *h;
- int status;
-
- /* Find the record; __rec_search pins the page. */
- if ((e = __rec_search(t, nrec, SDELETE)) == NULL)
- return (RET_ERROR);
-
- /* Delete the record. */
- h = e->page;
- status = __rec_dleaf(t, h, e->index);
- if (status != RET_SUCCESS) {
- mpool_put(t->bt_mp, h, 0);
- return (status);
- }
- mpool_put(t->bt_mp, h, MPOOL_DIRTY);
- return (RET_SUCCESS);
-}
-
-/*
- * __REC_DLEAF -- Delete a single record from a recno leaf page.
- *
- * Parameters:
- * t: tree
- * idx: index on current page to delete
- *
- * Returns:
- * RET_SUCCESS, RET_ERROR.
- */
-int
-__rec_dleaf(t, h, idx)
- BTREE *t;
- PAGE *h;
- u_int32_t idx;
-{
- RLEAF *rl;
- indx_t *ip, cnt, offset;
- u_int32_t nbytes;
- char *from;
- void *to;
-
- /*
- * Delete a record from a recno leaf page. Internal records are never
- * deleted from internal pages, regardless of the records that caused
- * them to be added being deleted. Pages made empty by deletion are
- * not reclaimed. They are, however, made available for reuse.
- *
- * Pack the remaining entries at the end of the page, shift the indices
- * down, overwriting the deleted record and its index. If the record
- * uses overflow pages, make them available for reuse.
- */
- to = rl = GETRLEAF(h, idx);
- if (rl->flags & P_BIGDATA && __ovfl_delete(t, rl->bytes) == RET_ERROR)
- return (RET_ERROR);
- nbytes = NRLEAF(rl);
-
- /*
- * Compress the key/data pairs. Compress and adjust the [BR]LEAF
- * offsets. Reset the headers.
- */
- from = (char *)h + h->upper;
- memmove(from + nbytes, from, (char *)to - from);
- h->upper += nbytes;
-
- offset = h->linp[idx];
- for (cnt = &h->linp[idx] - (ip = &h->linp[0]); cnt--; ++ip)
- if (ip[0] < offset)
- ip[0] += nbytes;
- for (cnt = &h->linp[NEXTINDEX(h)] - ip; --cnt; ++ip)
- ip[0] = ip[1] < offset ? ip[1] + nbytes : ip[1];
- h->lower -= sizeof(indx_t);
- --t->bt_nrecs;
- return (RET_SUCCESS);
-}
diff --git a/src/util/db2/recno/rec_get.c b/src/util/db2/recno/rec_get.c
deleted file mode 100644
index 230b2d4f54..0000000000
--- a/src/util/db2/recno/rec_get.c
+++ /dev/null
@@ -1,311 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)rec_get.c 8.9 (Berkeley) 8/18/94";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-
-#include <errno.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "db-int.h"
-#include "recno.h"
-
-/*
- * __REC_GET -- Get a record from the btree.
- *
- * Parameters:
- * dbp: pointer to access method
- * key: key to find
- * data: data to return
- * flag: currently unused
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS and RET_SPECIAL if the key not found.
- */
-int
-__rec_get(dbp, key, data, flags)
- const DB *dbp;
- const DBT *key;
- DBT *data;
- u_int flags;
-{
- BTREE *t;
- EPG *e;
- recno_t nrec;
- int status;
-
- t = dbp->internal;
-
- /* Toss any page pinned across calls. */
- if (t->bt_pinned != NULL) {
- mpool_put(t->bt_mp, t->bt_pinned, 0);
- t->bt_pinned = NULL;
- }
-
- /* Get currently doesn't take any flags, and keys of 0 are illegal. */
- if (flags || (nrec = *(recno_t *)key->data) == 0) {
- errno = EINVAL;
- return (RET_ERROR);
- }
-
- /*
- * If we haven't seen this record yet, try to find it in the
- * original file.
- */
- if (nrec > t->bt_nrecs) {
- if (F_ISSET(t, R_EOF | R_INMEM))
- return (RET_SPECIAL);
- if ((status = t->bt_irec(t, nrec)) != RET_SUCCESS)
- return (status);
- }
-
- --nrec;
- if ((e = __rec_search(t, nrec, SEARCH)) == NULL)
- return (RET_ERROR);
-
- status = __rec_ret(t, e, 0, NULL, data);
- if (F_ISSET(t, B_DB_LOCK))
- mpool_put(t->bt_mp, e->page, 0);
- else
- t->bt_pinned = e->page;
- return (status);
-}
-
-/*
- * __REC_FPIPE -- Get fixed length records from a pipe.
- *
- * Parameters:
- * t: tree
- * cnt: records to read
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS
- */
-int
-__rec_fpipe(t, top)
- BTREE *t;
- recno_t top;
-{
- DBT data;
- recno_t nrec;
- size_t len;
- int ch;
- u_char *p;
-
- if (t->bt_rdata.size < t->bt_reclen) {
- t->bt_rdata.data = t->bt_rdata.data == NULL ?
- malloc(t->bt_reclen) :
- realloc(t->bt_rdata.data, t->bt_reclen);
- if (t->bt_rdata.data == NULL)
- return (RET_ERROR);
- t->bt_rdata.size = t->bt_reclen;
- }
- data.data = t->bt_rdata.data;
- data.size = t->bt_reclen;
-
- for (nrec = t->bt_nrecs; nrec < top;) {
- len = t->bt_reclen;
- for (p = t->bt_rdata.data;; *p++ = ch)
- if ((ch = getc(t->bt_rfp)) == EOF || !--len) {
- if (ch != EOF)
- *p = ch;
- if (len != 0)
- memset(p, t->bt_bval, len);
- if (__rec_iput(t,
- nrec, &data, 0) != RET_SUCCESS)
- return (RET_ERROR);
- ++nrec;
- break;
- }
- if (ch == EOF)
- break;
- }
- if (nrec < top) {
- F_SET(t, R_EOF);
- return (RET_SPECIAL);
- }
- return (RET_SUCCESS);
-}
-
-/*
- * __REC_VPIPE -- Get variable length records from a pipe.
- *
- * Parameters:
- * t: tree
- * cnt: records to read
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS
- */
-int
-__rec_vpipe(t, top)
- BTREE *t;
- recno_t top;
-{
- DBT data;
- recno_t nrec;
- indx_t len;
- size_t sz;
- int bval, ch;
- u_char *p;
-
- bval = t->bt_bval;
- for (nrec = t->bt_nrecs; nrec < top; ++nrec) {
- for (p = t->bt_rdata.data,
- sz = t->bt_rdata.size;; *p++ = ch, --sz) {
- if ((ch = getc(t->bt_rfp)) == EOF || ch == bval) {
- data.data = t->bt_rdata.data;
- data.size = p - (u_char *)t->bt_rdata.data;
- if (ch == EOF && data.size == 0)
- break;
- if (__rec_iput(t, nrec, &data, 0)
- != RET_SUCCESS)
- return (RET_ERROR);
- break;
- }
- if (sz == 0) {
- len = p - (u_char *)t->bt_rdata.data;
- t->bt_rdata.size += (sz = 256);
- t->bt_rdata.data = t->bt_rdata.data == NULL ?
- malloc(t->bt_rdata.size) :
- realloc(t->bt_rdata.data, t->bt_rdata.size);
- if (t->bt_rdata.data == NULL)
- return (RET_ERROR);
- p = (u_char *)t->bt_rdata.data + len;
- }
- }
- if (ch == EOF)
- break;
- }
- if (nrec < top) {
- F_SET(t, R_EOF);
- return (RET_SPECIAL);
- }
- return (RET_SUCCESS);
-}
-
-/*
- * __REC_FMAP -- Get fixed length records from a file.
- *
- * Parameters:
- * t: tree
- * cnt: records to read
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS
- */
-int
-__rec_fmap(t, top)
- BTREE *t;
- recno_t top;
-{
- DBT data;
- recno_t nrec;
- u_char *sp, *ep, *p;
- size_t len;
-
- if (t->bt_rdata.size < t->bt_reclen) {
- t->bt_rdata.data = t->bt_rdata.data == NULL ?
- malloc(t->bt_reclen) :
- realloc(t->bt_rdata.data, t->bt_reclen);
- if (t->bt_rdata.data == NULL)
- return (RET_ERROR);
- t->bt_rdata.size = t->bt_reclen;
- }
- data.data = t->bt_rdata.data;
- data.size = t->bt_reclen;
-
- sp = (u_char *)t->bt_cmap;
- ep = (u_char *)t->bt_emap;
- for (nrec = t->bt_nrecs; nrec < top; ++nrec) {
- if (sp >= ep) {
- F_SET(t, R_EOF);
- return (RET_SPECIAL);
- }
- len = t->bt_reclen;
- for (p = t->bt_rdata.data;
- sp < ep && len > 0; *p++ = *sp++, --len);
- if (len != 0)
- memset(p, t->bt_bval, len);
- if (__rec_iput(t, nrec, &data, 0) != RET_SUCCESS)
- return (RET_ERROR);
- }
- t->bt_cmap = (caddr_t)sp;
- return (RET_SUCCESS);
-}
-
-/*
- * __REC_VMAP -- Get variable length records from a file.
- *
- * Parameters:
- * t: tree
- * cnt: records to read
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS
- */
-int
-__rec_vmap(t, top)
- BTREE *t;
- recno_t top;
-{
- DBT data;
- u_char *sp, *ep;
- recno_t nrec;
- int bval;
-
- sp = (u_char *)t->bt_cmap;
- ep = (u_char *)t->bt_emap;
- bval = t->bt_bval;
-
- for (nrec = t->bt_nrecs; nrec < top; ++nrec) {
- if (sp >= ep) {
- F_SET(t, R_EOF);
- return (RET_SPECIAL);
- }
- for (data.data = sp; sp < ep && *sp != bval; ++sp);
- data.size = sp - (u_char *)data.data;
- if (__rec_iput(t, nrec, &data, 0) != RET_SUCCESS)
- return (RET_ERROR);
- ++sp;
- }
- t->bt_cmap = (caddr_t)sp;
- return (RET_SUCCESS);
-}
diff --git a/src/util/db2/recno/rec_open.c b/src/util/db2/recno/rec_open.c
deleted file mode 100644
index f18a1cb028..0000000000
--- a/src/util/db2/recno/rec_open.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Mike Olson.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)rec_open.c 8.12 (Berkeley) 11/18/94";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-#ifdef RECNO_USE_MMAP
-#include <sys/mman.h>
-#endif
-#include <sys/stat.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <unistd.h>
-
-#include "db-int.h"
-#include "recno.h"
-
-DB *
-__rec_open(fname, flags, mode, openinfo, dflags)
- const char *fname;
- int flags, mode, dflags;
- const RECNOINFO *openinfo;
-{
- BTREE *t;
- BTREEINFO btopeninfo;
- DB *dbp;
- PAGE *h;
- struct stat sb;
- int rfd, sverrno;
-
- /* Open the user's file -- if this fails, we're done. */
- if (fname != NULL && (rfd = open(fname, flags | O_BINARY, mode)) < 0)
- return (NULL);
-
- /* Create a btree in memory (backed by disk). */
- dbp = NULL;
- if (openinfo) {
- if (openinfo->flags & ~(R_FIXEDLEN | R_NOKEY | R_SNAPSHOT))
- goto einval;
- btopeninfo.flags = 0;
- btopeninfo.cachesize = openinfo->cachesize;
- btopeninfo.maxkeypage = 0;
- btopeninfo.minkeypage = 0;
- btopeninfo.psize = openinfo->psize;
- btopeninfo.compare = NULL;
- btopeninfo.prefix = NULL;
- btopeninfo.lorder = openinfo->lorder;
- dbp = __bt_open(openinfo->bfname,
- O_RDWR | O_BINARY, S_IRUSR | S_IWUSR, &btopeninfo, dflags);
- } else
- dbp = __bt_open(NULL, O_RDWR | O_BINARY, S_IRUSR | S_IWUSR, NULL, dflags);
- if (dbp == NULL)
- goto err;
-
- /*
- * Some fields in the tree structure are recno specific. Fill them
- * in and make the btree structure look like a recno structure. We
- * don't change the bt_ovflsize value, it's close enough and slightly
- * bigger.
- */
- t = dbp->internal;
- if (openinfo) {
- if (openinfo->flags & R_FIXEDLEN) {
- F_SET(t, R_FIXLEN);
- t->bt_reclen = openinfo->reclen;
- if (t->bt_reclen == 0)
- goto einval;
- }
- t->bt_bval = openinfo->bval;
- } else
- t->bt_bval = '\n';
-
- F_SET(t, R_RECNO);
- if (fname == NULL)
- F_SET(t, R_EOF | R_INMEM);
- else
- t->bt_rfd = rfd;
-
- if (fname != NULL) {
- /*
- * In 4.4BSD, stat(2) returns true for ISSOCK on pipes.
- * Unfortunately, that's not portable, so we use lseek
- * and check the errno values.
- */
- errno = 0;
- if (lseek(rfd, (off_t)0, SEEK_CUR) == -1 && errno == ESPIPE) {
- switch (flags & O_ACCMODE) {
- case O_RDONLY:
- F_SET(t, R_RDONLY);
- break;
- default:
- goto einval;
- }
-slow: if ((t->bt_rfp = fdopen(rfd, "rb")) == NULL)
- goto err;
- F_SET(t, R_CLOSEFP);
- t->bt_irec =
- F_ISSET(t, R_FIXLEN) ? __rec_fpipe : __rec_vpipe;
- } else {
- switch (flags & O_ACCMODE) {
- case O_RDONLY:
- F_SET(t, R_RDONLY);
- break;
- case O_RDWR:
- break;
- default:
- goto einval;
- }
-
- if (fstat(rfd, &sb))
- goto err;
- /*
- * Kluge -- we'd like to test to see if the file is too
- * big to mmap. Since, we don't know what size or type
- * off_t's or size_t's are, what the largest unsigned
- * integral type is, or what random insanity the local
- * C compiler will perpetrate, doing the comparison in
- * a portable way is flatly impossible. Hope that mmap
- * fails if the file is too large.
- */
- if (sb.st_size == 0)
- F_SET(t, R_EOF);
- else {
-#ifdef RECNO_USE_MMAP
- /*
- * XXX
- * Mmap doesn't work correctly on many current
- * systems. In particular, it can fail subtly,
- * with cache coherency problems. Don't use it
- * for now.
- */
- t->bt_msize = sb.st_size;
- if ((t->bt_smap = mmap(NULL, t->bt_msize,
- PROT_READ, MAP_PRIVATE, rfd,
- (off_t)0)) == (caddr_t)-1)
- goto slow;
- t->bt_cmap = t->bt_smap;
- t->bt_emap = t->bt_smap + sb.st_size;
- t->bt_irec = F_ISSET(t, R_FIXLEN) ?
- __rec_fmap : __rec_vmap;
- F_SET(t, R_MEMMAPPED);
-#else
- goto slow;
-#endif
- }
- }
- }
-
- /* Use the recno routines. */
- dbp->close = __rec_close;
- dbp->del = __rec_delete;
- dbp->fd = __rec_fd;
- dbp->get = __rec_get;
- dbp->put = __rec_put;
- dbp->seq = __rec_seq;
- dbp->sync = __rec_sync;
-
- /* If the root page was created, reset the flags. */
- if ((h = mpool_get(t->bt_mp, P_ROOT, 0)) == NULL)
- goto err;
- if ((h->flags & P_TYPE) == P_BLEAF) {
- F_CLR(h, P_TYPE);
- F_SET(h, P_RLEAF);
- mpool_put(t->bt_mp, h, MPOOL_DIRTY);
- } else
- mpool_put(t->bt_mp, h, 0);
-
- if (openinfo && openinfo->flags & R_SNAPSHOT &&
- !F_ISSET(t, R_EOF | R_INMEM) &&
- t->bt_irec(t, MAX_REC_NUMBER) == RET_ERROR)
- goto err;
- return (dbp);
-
-einval: errno = EINVAL;
-err: sverrno = errno;
- if (dbp != NULL)
- (void)__bt_close(dbp);
- if (fname != NULL)
- (void)close(rfd);
- errno = sverrno;
- return (NULL);
-}
-
-int
-__rec_fd(dbp)
- const DB *dbp;
-{
- BTREE *t;
-
- t = dbp->internal;
-
- /* Toss any page pinned across calls. */
- if (t->bt_pinned != NULL) {
- mpool_put(t->bt_mp, t->bt_pinned, 0);
- t->bt_pinned = NULL;
- }
-
- /* In-memory database can't have a file descriptor. */
- if (F_ISSET(t, R_INMEM)) {
- errno = ENOENT;
- return (-1);
- }
- return (t->bt_rfd);
-}
diff --git a/src/util/db2/recno/rec_put.c b/src/util/db2/recno/rec_put.c
deleted file mode 100644
index e7fa75882f..0000000000
--- a/src/util/db2/recno/rec_put.c
+++ /dev/null
@@ -1,280 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)rec_put.c 8.7 (Berkeley) 8/18/94";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "db-int.h"
-#include "recno.h"
-
-/*
- * __REC_PUT -- Add a recno item to the tree.
- *
- * Parameters:
- * dbp: pointer to access method
- * key: key
- * data: data
- * flag: R_CURSOR, R_IAFTER, R_IBEFORE, R_NOOVERWRITE
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS and RET_SPECIAL if the key is
- * already in the tree and R_NOOVERWRITE specified.
- */
-int
-__rec_put(dbp, key, data, flags)
- const DB *dbp;
- DBT *key;
- const DBT *data;
- u_int flags;
-{
- BTREE *t;
- DBT fdata, tdata;
- recno_t nrec;
- int status;
-
- t = dbp->internal;
-
- /* Toss any page pinned across calls. */
- if (t->bt_pinned != NULL) {
- mpool_put(t->bt_mp, t->bt_pinned, 0);
- t->bt_pinned = NULL;
- }
-
- /*
- * If using fixed-length records, and the record is long, return
- * EINVAL. If it's short, pad it out. Use the record data return
- * memory, it's only short-term.
- */
- if (F_ISSET(t, R_FIXLEN) && data->size != t->bt_reclen) {
- if (data->size > t->bt_reclen)
- goto einval;
-
- if (t->bt_rdata.size < t->bt_reclen) {
- t->bt_rdata.data = t->bt_rdata.data == NULL ?
- malloc(t->bt_reclen) :
- realloc(t->bt_rdata.data, t->bt_reclen);
- if (t->bt_rdata.data == NULL)
- return (RET_ERROR);
- t->bt_rdata.size = t->bt_reclen;
- }
- memmove(t->bt_rdata.data, data->data, data->size);
- memset((char *)t->bt_rdata.data + data->size,
- t->bt_bval, t->bt_reclen - data->size);
- fdata.data = t->bt_rdata.data;
- fdata.size = t->bt_reclen;
- } else {
- fdata.data = data->data;
- fdata.size = data->size;
- }
-
- switch (flags) {
- case R_CURSOR:
- if (!F_ISSET(&t->bt_cursor, CURS_INIT))
- goto einval;
- nrec = t->bt_cursor.rcursor;
- break;
- case R_SETCURSOR:
- if ((nrec = *(recno_t *)key->data) == 0)
- goto einval;
- break;
- case R_IAFTER:
- if ((nrec = *(recno_t *)key->data) == 0) {
- nrec = 1;
- flags = R_IBEFORE;
- }
- break;
- case 0:
- case R_IBEFORE:
- if ((nrec = *(recno_t *)key->data) == 0)
- goto einval;
- break;
- case R_NOOVERWRITE:
- if ((nrec = *(recno_t *)key->data) == 0)
- goto einval;
- if (nrec <= t->bt_nrecs)
- return (RET_SPECIAL);
- break;
- default:
-einval: errno = EINVAL;
- return (RET_ERROR);
- }
-
- /*
- * Make sure that records up to and including the put record are
- * already in the database. If skipping records, create empty ones.
- */
- if (nrec > t->bt_nrecs) {
- if (!F_ISSET(t, R_EOF | R_INMEM) &&
- t->bt_irec(t, nrec) == RET_ERROR)
- return (RET_ERROR);
- if (nrec > t->bt_nrecs + 1) {
- if (F_ISSET(t, R_FIXLEN)) {
- if ((tdata.data =
- (void *)malloc(t->bt_reclen)) == NULL)
- return (RET_ERROR);
- tdata.size = t->bt_reclen;
- memset(tdata.data, t->bt_bval, tdata.size);
- } else {
- tdata.data = NULL;
- tdata.size = 0;
- }
- while (nrec > t->bt_nrecs + 1)
- if (__rec_iput(t,
- t->bt_nrecs, &tdata, 0) != RET_SUCCESS)
- return (RET_ERROR);
- if (F_ISSET(t, R_FIXLEN))
- free(tdata.data);
- }
- }
-
- if ((status = __rec_iput(t, nrec - 1, &fdata, flags)) != RET_SUCCESS)
- return (status);
-
- if (flags == R_SETCURSOR)
- t->bt_cursor.rcursor = nrec;
-
- F_SET(t, R_MODIFIED);
- return (__rec_ret(t, NULL, nrec, key, NULL));
-}
-
-/*
- * __REC_IPUT -- Add a recno item to the tree.
- *
- * Parameters:
- * t: tree
- * nrec: record number
- * data: data
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS
- */
-int
-__rec_iput(t, nrec, data, flags)
- BTREE *t;
- recno_t nrec;
- const DBT *data;
- u_int flags;
-{
- DBT tdata;
- EPG *e;
- PAGE *h;
- indx_t idx, nxtindex;
- db_pgno_t pg;
- u_int32_t nbytes;
- int dflags, status;
- char *dest, db[NOVFLSIZE];
-
- /*
- * If the data won't fit on a page, store it on indirect pages.
- *
- * XXX
- * If the insert fails later on, these pages aren't recovered.
- */
- if (data->size > t->bt_ovflsize) {
- if (__ovfl_put(t, data, &pg) == RET_ERROR)
- return (RET_ERROR);
- tdata.data = db;
- tdata.size = NOVFLSIZE;
- *(db_pgno_t *)db = pg;
- *(u_int32_t *)(db + sizeof(db_pgno_t)) = data->size;
- dflags = P_BIGDATA;
- data = &tdata;
- } else
- dflags = 0;
-
- /* __rec_search pins the returned page. */
- if ((e = __rec_search(t, nrec,
- nrec > t->bt_nrecs || flags == R_IAFTER || flags == R_IBEFORE ?
- SINSERT : SEARCH)) == NULL)
- return (RET_ERROR);
-
- h = e->page;
- idx = e->index;
-
- /*
- * Add the specified key/data pair to the tree. The R_IAFTER and
- * R_IBEFORE flags insert the key after/before the specified key.
- *
- * Pages are split as required.
- */
- switch (flags) {
- case R_IAFTER:
- ++idx;
- break;
- case R_IBEFORE:
- break;
- default:
- if (nrec < t->bt_nrecs &&
- __rec_dleaf(t, h, idx) == RET_ERROR) {
- mpool_put(t->bt_mp, h, 0);
- return (RET_ERROR);
- }
- break;
- }
-
- /*
- * If not enough room, split the page. The split code will insert
- * the key and data and unpin the current page. If inserting into
- * the offset array, shift the pointers up.
- */
- nbytes = NRLEAFDBT(data->size);
- if (h->upper - h->lower < nbytes + sizeof(indx_t)) {
- status = __bt_split(t, h, NULL, data, dflags, nbytes, idx);
- if (status == RET_SUCCESS)
- ++t->bt_nrecs;
- return (status);
- }
-
- if (idx < (nxtindex = NEXTINDEX(h)))
- memmove(h->linp + idx + 1, h->linp + idx,
- (nxtindex - idx) * sizeof(indx_t));
- h->lower += sizeof(indx_t);
-
- h->linp[idx] = h->upper -= nbytes;
- dest = (char *)h + h->upper;
- WR_RLEAF(dest, data, dflags);
-
- ++t->bt_nrecs;
- F_SET(t, B_MODIFIED);
- mpool_put(t->bt_mp, h, MPOOL_DIRTY);
-
- return (RET_SUCCESS);
-}
diff --git a/src/util/db2/recno/rec_search.c b/src/util/db2/recno/rec_search.c
deleted file mode 100644
index a328f1be06..0000000000
--- a/src/util/db2/recno/rec_search.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)rec_search.c 8.4 (Berkeley) 7/14/94";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/types.h>
-
-#include <errno.h>
-#include <stdio.h>
-
-#include "db-int.h"
-#include "recno.h"
-
-/*
- * __REC_SEARCH -- Search a btree for a key.
- *
- * Parameters:
- * t: tree to search
- * recno: key to find
- * op: search operation
- *
- * Returns:
- * EPG for matching record, if any, or the EPG for the location of the
- * key, if it were inserted into the tree.
- *
- * Returns:
- * The EPG for matching record, if any, or the EPG for the location
- * of the key, if it were inserted into the tree, is entered into
- * the bt_cur field of the tree. A pointer to the field is returned.
- */
-EPG *
-__rec_search(t, recno, op)
- BTREE *t;
- recno_t recno;
- enum SRCHOP op;
-{
- register indx_t idx;
- register PAGE *h;
- EPGNO *parent;
- RINTERNAL *r;
- db_pgno_t pg;
- indx_t top;
- recno_t total;
- int sverrno;
-
- BT_CLR(t);
- for (pg = P_ROOT, total = 0;;) {
- if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
- goto err;
- if (h->flags & P_RLEAF) {
- t->bt_cur.page = h;
- t->bt_cur.index = recno - total;
- return (&t->bt_cur);
- }
- for (idx = 0, top = NEXTINDEX(h);;) {
- r = GETRINTERNAL(h, idx);
- if (++idx == top || total + r->nrecs > recno)
- break;
- total += r->nrecs;
- }
-
- BT_PUSH(t, pg, idx - 1);
-
- pg = r->pgno;
- switch (op) {
- case SDELETE:
- --GETRINTERNAL(h, (idx - 1))->nrecs;
- mpool_put(t->bt_mp, h, MPOOL_DIRTY);
- break;
- case SINSERT:
- ++GETRINTERNAL(h, (idx - 1))->nrecs;
- mpool_put(t->bt_mp, h, MPOOL_DIRTY);
- break;
- case SEARCH:
- mpool_put(t->bt_mp, h, 0);
- break;
- }
-
- }
- /* Try and recover the tree. */
-err: sverrno = errno;
- if (op != SEARCH)
- while ((parent = BT_POP(t)) != NULL) {
- if ((h = mpool_get(t->bt_mp, parent->pgno, 0)) == NULL)
- break;
- if (op == SINSERT)
- --GETRINTERNAL(h, parent->index)->nrecs;
- else
- ++GETRINTERNAL(h, parent->index)->nrecs;
- mpool_put(t->bt_mp, h, MPOOL_DIRTY);
- }
- errno = sverrno;
- return (NULL);
-}
diff --git a/src/util/db2/recno/rec_seq.c b/src/util/db2/recno/rec_seq.c
deleted file mode 100644
index 1edaa998e8..0000000000
--- a/src/util/db2/recno/rec_seq.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)rec_seq.c 8.3 (Berkeley) 7/14/94";
-#endif /* not lint */
-
-#include <sys/types.h>
-
-#include <errno.h>
-#include <limits.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "db-int.h"
-#include "recno.h"
-
-/*
- * __REC_SEQ -- Recno sequential scan interface.
- *
- * Parameters:
- * dbp: pointer to access method
- * key: key for positioning and return value
- * data: data return value
- * flags: R_CURSOR, R_FIRST, R_LAST, R_NEXT, R_PREV.
- *
- * Returns:
- * RET_ERROR, RET_SUCCESS or RET_SPECIAL if there's no next key.
- */
-int
-__rec_seq(dbp, key, data, flags)
- const DB *dbp;
- DBT *key, *data;
- u_int flags;
-{
- BTREE *t;
- EPG *e;
- recno_t nrec;
- int status;
-
- t = dbp->internal;
-
- /* Toss any page pinned across calls. */
- if (t->bt_pinned != NULL) {
- mpool_put(t->bt_mp, t->bt_pinned, 0);
- t->bt_pinned = NULL;
- }
-
- switch(flags) {
- case R_CURSOR:
- if ((nrec = *(recno_t *)key->data) == 0)
- goto einval;
- break;
- case R_NEXT:
- if (F_ISSET(&t->bt_cursor, CURS_INIT)) {
- nrec = t->bt_cursor.rcursor + 1;
- break;
- }
- /* FALLTHROUGH */
- case R_FIRST:
- nrec = 1;
- break;
- case R_PREV:
- if (F_ISSET(&t->bt_cursor, CURS_INIT)) {
- if ((nrec = t->bt_cursor.rcursor - 1) == 0)
- return (RET_SPECIAL);
- break;
- }
- /* FALLTHROUGH */
- case R_LAST:
- if (!F_ISSET(t, R_EOF | R_INMEM) &&
- t->bt_irec(t, MAX_REC_NUMBER) == RET_ERROR)
- return (RET_ERROR);
- nrec = t->bt_nrecs;
- break;
- default:
-einval: errno = EINVAL;
- return (RET_ERROR);
- }
-
- if (t->bt_nrecs == 0 || nrec > t->bt_nrecs) {
- if (!F_ISSET(t, R_EOF | R_INMEM) &&
- (status = t->bt_irec(t, nrec)) != RET_SUCCESS)
- return (status);
- if (t->bt_nrecs == 0 || nrec > t->bt_nrecs)
- return (RET_SPECIAL);
- }
-
- if ((e = __rec_search(t, nrec - 1, SEARCH)) == NULL)
- return (RET_ERROR);
-
- F_SET(&t->bt_cursor, CURS_INIT);
- t->bt_cursor.rcursor = nrec;
-
- status = __rec_ret(t, e, nrec, key, data);
- if (F_ISSET(t, B_DB_LOCK))
- mpool_put(t->bt_mp, e->page, 0);
- else
- t->bt_pinned = e->page;
- return (status);
-}
diff --git a/src/util/db2/recno/rec_utils.c b/src/util/db2/recno/rec_utils.c
deleted file mode 100644
index f757a724f5..0000000000
--- a/src/util/db2/recno/rec_utils.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)rec_utils.c 8.6 (Berkeley) 7/16/94";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/param.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "db-int.h"
-#include "recno.h"
-
-/*
- * __rec_ret --
- * Build return data.
- *
- * Parameters:
- * t: tree
- * e: key/data pair to be returned
- * nrec: record number
- * key: user's key structure
- * data: user's data structure
- *
- * Returns:
- * RET_SUCCESS, RET_ERROR.
- */
-int
-__rec_ret(t, e, nrec, key, data)
- BTREE *t;
- EPG *e;
- recno_t nrec;
- DBT *key, *data;
-{
- RLEAF *rl;
- void *p;
-
- if (key == NULL)
- goto dataonly;
-
- /* We have to copy the key, it's not on the page. */
- if (sizeof(recno_t) > t->bt_rkey.size) {
- p = (void *)(t->bt_rkey.data == NULL ?
- malloc(sizeof(recno_t)) :
- realloc(t->bt_rkey.data, sizeof(recno_t)));
- if (p == NULL)
- return (RET_ERROR);
- t->bt_rkey.data = p;
- t->bt_rkey.size = sizeof(recno_t);
- }
- memmove(t->bt_rkey.data, &nrec, sizeof(recno_t));
- key->size = sizeof(recno_t);
- key->data = t->bt_rkey.data;
-
-dataonly:
- if (data == NULL)
- return (RET_SUCCESS);
-
- /*
- * We must copy big keys/data to make them contigous. Otherwise,
- * leave the page pinned and don't copy unless the user specified
- * concurrent access.
- */
- rl = GETRLEAF(e->page, e->index);
- if (rl->flags & P_BIGDATA) {
- if (__ovfl_get(t, rl->bytes,
- &data->size, &t->bt_rdata.data, &t->bt_rdata.size))
- return (RET_ERROR);
- data->data = t->bt_rdata.data;
- } else if (F_ISSET(t, B_DB_LOCK)) {
- /* Use +1 in case the first record retrieved is 0 length. */
- if (rl->dsize + 1 > t->bt_rdata.size) {
- p = (void *)(t->bt_rdata.data == NULL ?
- malloc(rl->dsize + 1) :
- realloc(t->bt_rdata.data, rl->dsize + 1));
- if (p == NULL)
- return (RET_ERROR);
- t->bt_rdata.data = p;
- t->bt_rdata.size = rl->dsize + 1;
- }
- memmove(t->bt_rdata.data, rl->bytes, rl->dsize);
- data->size = rl->dsize;
- data->data = t->bt_rdata.data;
- } else {
- data->size = rl->dsize;
- data->data = rl->bytes;
- }
- return (RET_SUCCESS);
-}
diff --git a/src/util/db2/recno/recno.h b/src/util/db2/recno/recno.h
deleted file mode 100644
index bec772c2fa..0000000000
--- a/src/util/db2/recno/recno.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)recno.h 8.1 (Berkeley) 6/4/93
- */
-
-enum SRCHOP { SDELETE, SINSERT, SEARCH}; /* Rec_search operation. */
-
-#include "../btree/btree.h"
-#include "extern.h"
diff --git a/src/util/db2/test/ChangeLog b/src/util/db2/test/ChangeLog
deleted file mode 100644
index cfcce7d7fa..0000000000
--- a/src/util/db2/test/ChangeLog
+++ /dev/null
@@ -1,74 +0,0 @@
-2004-08-27 Ken Raeburn <raeburn@mit.edu>
-
- * run.test (getnwords): Run data through "cat -v", because at
- least one version of Debian Linux has an English dictionary with
- Latin-1 characters and a "rev" that seems to default to some sort
- of Unicode.
-
-2004-08-15 Ken Raeburn <raeburn@mit.edu>
-
- * run.test (getnwords): Rewrite to drop blank lines before
- counting lines, not after.
-
-2004-08-12 Ken Raeburn <raeburn@mit.edu>
-
- * run.test (getnwords): New function. Uses sed to get N words
- from $DICT as other functions did before, but discards blank
- lines.
- (test1, test2, test12, test13, test20): Call getnwords.
-
-2003-01-05 Sam Hartman <hartmans@mit.edu>
-
- * SEQ_TEST/t.c (main): Remove declaration of errno
-
-2002-08-29 Ken Raeburn <raeburn@mit.edu>
-
- * Makefile.in: Revert $(S)=>/ change, for Windows support.
-
-2002-08-23 Ken Raeburn <raeburn@mit.edu>
-
- * Makefile: Deleted.
-
- * Makefile.in: Change $(S)=>/ and $(U)=>.. globally.
-
-2002-08-23 Tom Yu <tlyu@mit.edu>
-
- * dbtest.c: Include btree.h if we're compiled with -DSTATISTICS.
-
- * Makefile.in: Add rules for bttest; also add a clean rule.
-
-2002-05-08 Ken Raeburn <raeburn@mit.edu>
-
- * dbtest.c: Test for __STDC__ defined, not nonzero, to decide
- whether to use stdarg.h or varargs.h.
- (err): Similarly for function signature.
-
-2002-02-19 Ken Raeburn <raeburn@mit.edu>
-
- * run.test: Use "/bin/." instead of "/bin" in find commands in
- case /bin itself is a symlink.
- (test8): Check exit status of dbtest program.
-
- * dbtest.c (compare): Exit with error indication if comparison of
- contents indicates a difference.
- (get): Exit with error indication after printing message if key
- not found.
-
-2002-01-04 Ken Raeburn <raeburn@mit.edu>
-
- * run.test (test8): If test reports an error, exit with error
- indication.
-
- * dbtest.c (compare): Exit with error indication if size
- comparison fails.
-
-2000-06-26 Ken Raeburn <raeburn@mit.edu>
-
- * dbtest.c (err): Add format attribute to decl, for typechecking
- under GNU C.
-
-1998-05-06 Theodore Ts'o <tytso@rsts-11.mit.edu>
-
- * dbtest.c (main): POSIX states that getopt returns -1
- when it is done parsing options, not EOF.
-
diff --git a/src/util/db2/test/Makefile.in b/src/util/db2/test/Makefile.in
deleted file mode 100644
index 18d366ca83..0000000000
--- a/src/util/db2/test/Makefile.in
+++ /dev/null
@@ -1,33 +0,0 @@
-thisconfigdir=./..
-myfulldir=util/db2/test
-mydir=test
-BUILDTOP=$(REL)..$(S)..$(S)..
-
-FCTSH = @FCTSH@
-TMPDIR=.
-
-LOCALINCLUDES= -I. -I$(srcdir)/../include -I../include -I$(srcdir)/../mpool \
- -I$(srcdir)/../btree -I$(srcdir)/../hash -I$(srcdir)/../db
-
-PROG_LIBPATH=-L$(TOPLIBD)
-PROG_RPATH=$(KRB5_LIBDIR)
-
-KRB5_RUN_ENV= @KRB5_RUN_ENV@
-
-all::
-
-dbtest: dbtest.o $(DB_DEPLIB)
- $(CC_LINK) -o $@ dbtest.o $(STRERROR_OBJ) $(DB_LIB)
-
-check:: dbtest
- $(KRB5_RUN_ENV) srcdir=$(srcdir) TMPDIR=$(TMPDIR) $(FCTSH) $(srcdir)/run.test
-
-bttest.o: $(srcdir)/btree.tests/main.c
- $(CC) $(ALL_CFLAGS) -c $(srcdir)/btree.tests/main.c -o $@
-
-bttest: bttest.o $(DB_DEPLIB)
- $(CC_LINK) -o $@ bttest.o $(STRERROR_OBJ) $(DB_LIB)
-
-clean-unix::
- $(RM) dbtest.o dbtest __dbtest
- $(RM) bttest.o bttest
diff --git a/src/util/db2/test/README b/src/util/db2/test/README
deleted file mode 100644
index 0c0cd13d8f..0000000000
--- a/src/util/db2/test/README
+++ /dev/null
@@ -1,74 +0,0 @@
-# @(#)README 8.8 (Berkeley) 7/31/94
-
-To build this portably, try something like:
-
- make PORTDIR="../PORT/MACH"
-
-where MACH is the machine, i.e. "sunos.4.1.1".
-
-To run the tests, enter "sh run.test". If your system dictionary isn't
-in /usr/share/dict/words, edit run.test to reflect the correct place.
-
-Fairly large files (the command files) are built in this directory during
-the test runs, and even larger files (the database files) are created in
-"/var/tmp". If the latter directory doesn't exist, set the environmental
-variable TMPDIR to a directory where the files can be built.
-
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-The script file consists of lines with an initial character which is
-the command for that line, or an initial character indicating a key
-or data entry for a previous command.
-
-Legal command characters are as follows:
-
-c: compare a record
- + must be followed by [kK][dD]; the data value in the database
- associated with the specified key is compared to the specified
- data value.
-e: echo a string
- + writes out the rest of the line into the output file; if the
- last character is not a carriage-return, a newline is appended.
-f: set the flags for the next command
- + no value zero's the flags
-g: do a get command
- + must be followed by [kK]
- + writes out the retrieved data DBT.
-o [r]: dump [reverse]
- + dump the database out, if 'r' is set, in reverse order.
-p: do a put command
- + must be followed by [kK][dD]
-r: do a del command
- + must be followed by [kK] unless R_CURSOR flag set.
-S: sync the database
-s: do a seq command
- + must be followed by [kK] if R_CURSOR flag set.
- + writes out the retrieved data DBT.
-
-Legal key/data characters are as follows:
-
-D [file]: data file
- + set the current data value to the contents of the file
-d [data]:
- + set the current key value to the contents of the line.
-K [file]: key file
- + set the current key value to the contents of the file
-k [data]:
- + set the current key value to the contents of the line.
-
-Blank lines, lines with leading white space, and lines with leading
-hash marks (#) are ignored.
-
-Options to dbtest are as follows:
-
- -d: Set the DB_LOCK flag.
- -f: Use the file argument as the database file.
- -i: Use the rest of the argument to set elements in the info
- structure. If the type is btree, then "-i cachesize=10240"
- will set BTREEINFO.cachesize to 10240.
- -o: The rest of the argument is the output file instead of
- using stdout.
- -s: Don't delete the database file before opening it, i.e.
- use the database file from a previous run.
-
-Dbtest requires two arguments, the type of access "hash", "recno"
-or "btree", and the script name or "-" to indicate stdin.
diff --git a/src/util/db2/test/SEQ_TEST/data b/src/util/db2/test/SEQ_TEST/data
deleted file mode 100644
index 37a518537e..0000000000
--- a/src/util/db2/test/SEQ_TEST/data
+++ /dev/null
@@ -1,8 +0,0 @@
-A000027875A000135891
-A000059165A000130168
-A000060256A000133490
-A040025906A000136770
-A040027881A000135829
-A040028611A000137873
-A040032413A000056974
-A040050163A000126233
diff --git a/src/util/db2/test/SEQ_TEST/mbox b/src/util/db2/test/SEQ_TEST/mbox
deleted file mode 100644
index 9d5d49d073..0000000000
--- a/src/util/db2/test/SEQ_TEST/mbox
+++ /dev/null
@@ -1,399 +0,0 @@
-From wiggans@aipl.arsusda.gov Mon Sep 12 11:05:58 1994
-Received: from vangogh.CS.Berkeley.EDU by python.bostic.com (8.6.9.Beta4/2.6)
- id OAA16853; Mon, 12 Sep 1994 14:05:42 -0400
-From: wiggans@aipl.arsusda.gov
-Received: from hofmann.CS.Berkeley.EDU (hofmann.CS.Berkeley.EDU [128.32.34.35]) by vangogh.CS.Berkeley.EDU (8.7.Alpha.1/8.6.9.Beta0) with ESMTP id LAA15825 for <bostic@vangogh.CS.Berkeley.EDU>; Mon, 12 Sep 1994 11:05:20 -0700 (PDT)
-Received: from uu7.psi.com (uu7.psi.com [38.145.204.6]) by hofmann.CS.Berkeley.EDU (8.6.9/8.6.6.Beta11) with SMTP id LAA25681 for <bostic@cs.berkeley.edu>; Mon, 12 Sep 1994 11:05:44 -0700
-Received: from AIPL.ARSUSDA.GOV by uu7.psi.com (5.65b/4.0.071791-PSI/PSINet) via SMTP;
- id AA00699 for bostic@cs.berkeley.edu; Mon, 12 Sep 94 14:06:15 -0400
-Received: by aipl.arsusda.gov (AIX 3.2/UCB 5.64/4.03)
- id AA14802; Mon, 12 Sep 1994 14:05:48 -0400
-Message-Id: <9409121805.AA14802@aipl.arsusda.gov>
-Subject: db 1.85 problem
-To: bostic@cs.berkeley.edu (Keith Bostic)
-Date: Mon, 12 Sep 1994 14:05:47 -0400 (EDT)
-X-Mailer: ELM [version 2.4 PL22]
-Content-Type: text
-Content-Length: 2553
-Status: RO
-
-In using the btree option to sequentially read and then write a file, we
-are having a problem with 1.85. When compiled with 1.73 there is no
-problem. The problem is that the seq call keeps reading the same record.
-The code follows:
-
-/* chkseq.c Check sequential read and write */
-
-#include <stdio.h>
-#include <sys/stat.h>
-#include <string.h>
-#include <stdlib.h>
-#include <fcntl.h> /* O_CREAT, O_RDWR */
-#include <errno.h> /* Error numbers */
-#include <db.h>
-
-extern int errno;
-extern char *sys_errlist[];
-
-typedef struct idst {
- char id1[7];
-} id;
-
-void cvtid(char *, char *);
-
-void main() {
- char anim10[11], datastor[212],keystor[10], *pc;
- int i;
- long in = 0L;
- DB *dbp, *dbpo;
- DBT key, data, keyo, datao;
-
- if ((dbp = dbopen("bullxrf.db", O_RDWR, 0664
- , DB_BTREE, NULL )) == NULL) {
- printf("\n Error on dbopen %d %s\n",errno,strerror(errno));
- exit(61);
- }
- key.size = 7;
- keyo.size = 7;
-
- while (dbp->seq(dbp, &key, &data,R_NEXT) == 0) {
- in++;
- if (in > 20) break;
-/* pc = (char *) key.data;
-for (i=0;i<key.size;i++) printf("%02x",pc[i]); printf("\n"); */
- cvtid(anim10,key.data); printf("%s\n",anim10);
- memcpy(keystor,key.data,key.size);
-/* for (i=0;i<key.size;i++) printf("%02x",keystor[i]); printf("\n"); */
- memcpy(datastor,data.data,data.size);
-/* for (i=0;i<8;i++) printf("%02x",datastor[i]); printf("\n"); */
- keyo.data = keystor;
- datao.data = datastor;
- datao.size = data.size;
-/*
- if (in % 1000 == 1) {
- cvtid(anim10,key.data); printf("%5d %s\n",in,anim10); */
- if (dbp->put(dbp, &keyo, &datao,0) != 0) {
- printf("Write failed at %d\n",in);
- exit(85);
- }
-/* }
- */
- }
- printf("%d Records copied\n",in);
- dbp->close(dbp);
-}
-
-I am running on an RS/6000 AIX 3.2.5. The section of the make file
-follows:
-
-# Make file
-all: chkseq
-
-chkseq: chkseq.c
- cc -gO3 -lm -o chkseq\
- -L /data6/hash/include/sys/lib -l db -I /data6/hash/include \
- chkseq.c cvtid.o ascii.o
-# -L /data12/db.1.85 -l db -I /data12/db.1.85/include \
-
-We would appreciate your help.
-Thanks,
-
---
-George Wiggans I================================================I
- |Animal Improvement Programs Laboratory |
-Phone: 301-504-8407 |Bldg 263 Beltsville Agricultural Research Center|
-FAX: 301-504-8092 |Beltsville, MD 20705-2350 USA |
-wiggans@aipl.arsusda.gov | |
-=========================I================================================I
-
-From wiggans@aipl.arsusda.gov Fri Sep 16 20:27:22 1994
-Received: from vangogh.CS.Berkeley.EDU by python.bostic.com (8.6.9.Beta4/2.6)
- id XAA09260; Fri, 16 Sep 1994 23:27:09 -0400
-From: wiggans@aipl.arsusda.gov
-Received: from hofmann.CS.Berkeley.EDU (hofmann.CS.Berkeley.EDU [128.32.34.35]) by vangogh.CS.Berkeley.EDU (8.7.Alpha.1/8.6.9.Beta0) with ESMTP id UAA25674 for <bostic@vangogh.CS.Berkeley.EDU>; Fri, 16 Sep 1994 20:27:03 -0700 (PDT)
-Received: from uu7.psi.com (uu7.psi.com [38.145.204.6]) by hofmann.CS.Berkeley.EDU (8.6.9/8.6.6.Beta11) with SMTP id UAA15043 for <bostic@cs.berkeley.edu>; Fri, 16 Sep 1994 20:27:16 -0700
-Received: from AIPL.ARSUSDA.GOV by uu7.psi.com (5.65b/4.0.071791-PSI/PSINet) via SMTP;
- id AA18737 for bostic@cs.berkeley.edu; Fri, 16 Sep 94 23:27:14 -0400
-Received: by aipl.arsusda.gov (AIX 3.2/UCB 5.64/4.03)
- id AA10907; Fri, 16 Sep 1994 23:26:18 -0400
-Message-Id: <9409170326.AA10907@aipl.arsusda.gov>
-Subject: Test case
-To: bostic@cs.berkeley.edu (Keith Bostic)
-Date: Fri, 16 Sep 1994 23:26:16 -0400 (EDT)
-X-Mailer: ELM [version 2.4 PL22]
-Content-Type: text
-Content-Length: 3713
-Status: RO
-
-The following program loads 2 10 character animal ID which are used to
-change an animal's ID. After loading, it closes, then opens and
-sequentially reads and rewrites the file changing the first character of
-the 2nd ID to U. Failure is observed when the update part gets stuck on
-the first record, rereading it. The last step displays the updated file.
-The name of the data file is a command line argument.
-
-The data:
-A000027875A000135891
-A000059165A000130168
-A000060256A000133490
-A040025906A000136770
-A040027881A000135829
-A040028611A000137873
-A040032413A000056974
-A040050163A000126233
-A040050329A000126177
-A040050411A000119017
-A040050995A000116767
-A040051022A000126669
-A040051276A000127444
-A040051514A000120563
-A040051597A000127287
-A040051627A000127284
-A040051700A000126914
-A040051810A000127286
-A040051964A000118834
-A040052164A000135104
-A040052165A000127688
-A040052186A000126926
-A040052530A000126287
-A040052560A000119160
-A040052892A000125334
-A040053004A000127684
-A040053359A000128628
-A040053378A000137680
-A040053416A000128825
-A040053589A000120369
-A040053620A000128460
-A040053751A000123525
-A040053754A000126736
-A040054191A000126286
-A040054251A000121745
-A040054253A000127848
-A040054596A000130931
-A040054981A000128731
-A040055000A000127689
-
-The program:
-/* chkseq.c Check sequential read and write */
-
-#include <stdio.h>
-#include <sys/stat.h>
-#include <string.h>
-#include <stdlib.h>
-#include <fcntl.h> /* O_CREAT, O_RDWR */
-#include <errno.h> /* Error numbers */
-#include <db.h>
-
-extern int errno;
-extern char *sys_errlist[];
-
-
-void main(int argc, char *argv[]) {
- char id1[] = {" "}, id2[] = {" "};
- int i;
- long in = 0L, out = 0L;
- DB *dbp, *dbpo;
- DBT key, data, keyo, datao;
- FILE *fopen(), *fin;
-
- if ((fin = fopen(argv[1],"r")) == NULL) {
- printf("Unable to open %s\n",argv[1]);
- exit(25);
- }
- if ((dbp = dbopen("test.db",O_RDWR | O_CREAT, 0664
- , DB_BTREE, NULL )) == NULL) {
- printf("\n Open error on test.db %d %s\n",errno,strerror(errno));
- exit(25);
- }
-
- while (fscanf(fin," %10s%10s",id1,id2) > 0) {
- key.size = 11;
- data.size = 11;
- key.data = id1;
- data.data = id2;
- printf("%10s %10s\n",key.data,data.data);
- if (dbp->put(dbp, &key, &data,R_NOOVERWRITE) != 0) {
- printf("Error writing output\n");
- }
- out++;
- }
- printf("%d Records in\n",out);
- dbp->close(dbp);
-
- if ((dbp = dbopen("test.db", O_RDWR, 0664
- , DB_BTREE, NULL )) == NULL) {
- printf("\n Error on dbopen %d %s\n",errno,strerror(errno));
- exit(61);
- }
-
- while (dbp->seq(dbp, &key, &data,R_NEXT) == 0) {
- strcpy(id1,key.data);
- keyo.size = 11;
- datao.size = 11;
- keyo.data = id1;
- strcpy(id2,data.data);
- id2[0] = 'U';
- datao.data=id2;
- printf("%10s %10s\n",key.data,data.data);
- in++;
- if (in > 50) break;
- if (dbp->put(dbp, &keyo, &datao,0) != 0) {
- printf("Write failed at %d\n",in);
- exit(85);
- }
- }
- printf("%d Records copied\n",in);
- in = 0;
- dbp->seq(dbp, &key, &data,R_FIRST);
- printf("%10s %10s\n",key.data,data.data);
- in++;
- while (dbp->seq(dbp, &key, &data,R_NEXT) == 0) {
- in++;
- printf("%10s %10s\n",key.data,data.data);
- }
- printf("%d Records read\n",in);
- dbp->close(dbp);
-}
-
-
---
-George Wiggans I================================================I
- |Animal Improvement Programs Laboratory |
-Phone: 301-504-8407 |Bldg 263 Beltsville Agricultural Research Center|
-FAX: 301-504-8092 |Beltsville, MD 20705-2350 USA |
-wiggans@aipl.arsusda.gov | |
-=========================I================================================I
-
-From bostic Fri Sep 23 08:44:56 1994
-To: wiggans@aipl.arsusda.gov /usr/src/local/db/test/SEQ_TEST/mbox
-Subject: Re: Test case
-
-
-OK, I've attached a tentative patch for the bug, that appears
-to fix it on my local system. Please let me know if you have
-any further problems with this.
-
-There are a couple of issues here. The first, is that to some
-extent, the btree code is correct. You aren't replacing the
-cursor in your test program, you're adding a new key, which
-just happens to be where the cursor was. So, the btree code
-is doing you a favor by returning the new key as part of the
-cursor walk, and it's not its fault. ;-}
-
-However, because a put to the cursor record is done using a
-delete/add pair, doing it the "right" way will result in the
-exact same behavior as you saw doing it "wrong".
-
-Thinking about this further, there's another bug that's going to
-hit eventually -- if you have duplicate records, the current
-scheme of doing delete/add to replace the cursor record can result
-in a record being returned twice, which is tacky at best, if not
-actually wrong.
-
-I think I may have to revisit how duplicate records are stored.
-Which does not make me happy. ;-{
-
---keith
-
-*** db/btree/bt_seq.c.orig Fri Sep 23 08:35:06 1994
---- db/btree/bt_seq.c Fri Sep 23 08:34:58 1994
-***************
-*** 35,41 ****
- */
-
- #if defined(LIBC_SCCS) && !defined(lint)
-! static char sccsid[] = "@(#)bt_seq.c 8.7 (Berkeley) 7/20/94";
- #endif /* LIBC_SCCS and not lint */
-
- #include <sys/types.h>
---- 35,41 ----
- */
-
- #if defined(LIBC_SCCS) && !defined(lint)
-! static char sccsid[] = "@(#)bt_seq.c 8.8 (Berkeley) 9/23/94";
- #endif /* LIBC_SCCS and not lint */
-
- #include <sys/types.h>
-***************
-*** 246,252 ****
- PAGE *h;
- indx_t index;
- pgno_t pg;
-! int exact;
-
- /*
- * There are a couple of states that we can be in. The cursor has
---- 246,252 ----
- PAGE *h;
- indx_t index;
- pgno_t pg;
-! int exact, rval;
-
- /*
- * There are a couple of states that we can be in. The cursor has
-***************
-*** 255,269 ****
- c = &t->bt_cursor;
-
- /*
-! * The cursor was deleted where there weren't any duplicate records,
-! * so the key was saved. Find out where that key would go in the
-! * current tree. It doesn't matter if the returned key is an exact
-! * match or not -- if it's an exact match, the record was added after
-! * the delete so we can just return it. If not, as long as there's
-! * a record there, return it.
- */
-! if (F_ISSET(c, CURS_ACQUIRE))
-! return (__bt_first(t, &c->key, ep, &exact));
-
- /* Get the page referenced by the cursor. */
- if ((h = mpool_get(t->bt_mp, c->pg.pgno, 0)) == NULL)
---- 255,299 ----
- c = &t->bt_cursor;
-
- /*
-! * The cursor was deleted and there weren't any duplicate records,
-! * so the cursor's key was saved. Find out where that key would
-! * be in the current tree. If the returned key is an exact match,
-! * it means that a key/data pair was inserted into the tree after
-! * the delete. We could reasonably return the key, but the problem
-! * is that this is the access pattern we'll see if the user is
-! * doing seq(..., R_NEXT)/put(..., 0) pairs, i.e. the put deletes
-! * the cursor record and then replaces it, so the cursor was saved,
-! * and we'll simply return the same "new" record until the user
-! * notices and doesn't do a put() of it. Since the key is an exact
-! * match, we could as easily put the new record before the cursor,
-! * and we've made no guarantee to return it. So, move forward or
-! * back a record if it's an exact match.
-! *
-! * XXX
-! * In the current implementation, put's to the cursor are done with
-! * delete/add pairs. This has two consequences. First, it means
-! * that seq(..., R_NEXT)/put(..., R_CURSOR) pairs are going to exhibit
-! * the same behavior as above. Second, you can return the same key
-! * twice if you have duplicate records. The scenario is that the
-! * cursor record is deleted, moving the cursor forward or backward
-! * to a duplicate. The add then inserts the new record at a location
-! * ahead of the cursor because duplicates aren't sorted in any way,
-! * and the new record is later returned. This has to be fixed at some
-! * point.
- */
-! if (F_ISSET(c, CURS_ACQUIRE)) {
-! if (rval = __bt_first(t, &c->key, ep, &exact))
-! return (RET_ERROR);
-! if (!exact)
-! return (rval);
-! /*
-! * XXX
-! * Kluge -- get, release, get the page.
-! */
-! c->pg.pgno = ep->page->pgno;
-! c->pg.index = ep->index;
-! mpool_put(t->bt_mp, ep->page, 0);
-! }
-
- /* Get the page referenced by the cursor. */
- if ((h = mpool_get(t->bt_mp, c->pg.pgno, 0)) == NULL)
-
-
-
diff --git a/src/util/db2/test/SEQ_TEST/t.c b/src/util/db2/test/SEQ_TEST/t.c
deleted file mode 100644
index f77b676f14..0000000000
--- a/src/util/db2/test/SEQ_TEST/t.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/* chkseq.c Check sequential read and write */
-
-#include <sys/stat.h>
-#include "db-int.h"
-#include <errno.h> /* Error numbers */
-#include <fcntl.h> /* O_CREAT, O_RDWR */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-void main(int argc, char *argv[]) {
- char id1[] = {" "}, id2[] = {" "};
- int i;
- long in = 0L, out = 0L;
- DB *dbp, *dbpo;
- DBT key, data, keyo, datao;
- FILE *fopen(), *fin;
-
- unlink("test.db");
- if ((fin = fopen("data","r")) == NULL) {
- printf("Unable to open %s\n","data");
- exit(25);
- }
- if ((dbp = dbopen("test.db",O_RDWR | O_CREAT | O_BINARY, 0664
- , DB_BTREE, NULL )) == NULL) {
- printf("\n Open error on test.db %d %s\n",errno,strerror(errno));
- exit(25);
- }
-
- while (fscanf(fin," %10s%10s",id1,id2) > 0) {
- key.size = 11;
- data.size = 11;
- key.data = id1;
- data.data = id2;
- printf("%10s %10s\n",key.data,data.data);
- if (dbp->put(dbp, &key, &data,R_NOOVERWRITE) != 0) {
- printf("Error writing output\n");
- }
- out++;
- }
- printf("%d Records in\n",out);
- dbp->close(dbp);
-
- if ((dbp = dbopen("test.db", O_RDWR | O_BINARY, 0664
- , DB_BTREE, NULL )) == NULL) {
- printf("\n Error on dbopen %d %s\n",errno,strerror(errno));
- exit(61);
- }
-
- while (dbp->seq(dbp, &key, &data,R_NEXT) == 0) {
- strcpy(id1,key.data);
- keyo.size = 11;
- datao.size = 11;
- keyo.data = id1;
- strcpy(id2,data.data);
- id2[0] = 'U';
- datao.data=id2;
- printf("%10s %10s\n",key.data,data.data);
- in++;
- if (in > 10) break;
-#ifdef notdef
- if (dbp->put(dbp, &keyo, &datao,0) != 0) {
- printf("Write failed at %d\n",in);
- exit(85);
- }
-#else
- if (dbp->put(dbp, &keyo, &datao,R_CURSOR) != 0) {
- printf("Write failed at %d\n",in);
- exit(85);
- }
-#endif
- }
- printf("%d Records copied\n",in);
- in = 0;
- dbp->seq(dbp, &key, &data,R_FIRST);
- printf("%10s %10s\n",key.data,data.data);
- in++;
- while (dbp->seq(dbp, &key, &data,R_NEXT) == 0) {
- in++;
- printf("%10s %10s\n",key.data,data.data);
- }
- printf("%d Records read\n",in);
- dbp->close(dbp);
-}
diff --git a/src/util/db2/test/btree.tests/ChangeLog b/src/util/db2/test/btree.tests/ChangeLog
deleted file mode 100644
index 339db618af..0000000000
--- a/src/util/db2/test/btree.tests/ChangeLog
+++ /dev/null
@@ -1,17 +0,0 @@
-2002-08-23 Tom Yu <tlyu@mit.edu>
-
- * main.c: Disable append(); we don't have R_APPEND in this release
- of DB for some reason. Disable load() due to lack of fgetline().
- Conditionalize lots of things on -DSTATISTICS or -DDEBUG as
- appropriate.
- (rlist): New function; does recursive listing of principals.
- (main): Fix up naming of *_ENDIAN macros. Default to read-only
- open, with new "-w" option for opening read/write. Actually call
- db->sync with the correct number of arguments.
- (show): Update call to __bt_dpage().
- (usage): Update.
-
-1998-05-06 Theodore Ts'o <tytso@rsts-11.mit.edu>
-
- * main.c (main): POSIX states that getopt returns -1
- when it is done parsing options, not EOF.
diff --git a/src/util/db2/test/btree.tests/main.c b/src/util/db2/test/btree.tests/main.c
deleted file mode 100644
index 06f02b3ad0..0000000000
--- a/src/util/db2/test/btree.tests/main.c
+++ /dev/null
@@ -1,832 +0,0 @@
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Mike Olson.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/4/93";
-#endif /* LIBC_SCCS and not lint */
-
-#include <sys/param.h>
-#include <fcntl.h>
-#include "db-int.h"
-#include <errno.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include "btree.h"
-
-typedef struct cmd_table {
- char *cmd;
- int nargs;
- int rconv;
- void (*func) __P((DB *, char **));
- char *usage, *descrip;
-} cmd_table;
-
-int stopstop;
-DB *globaldb;
-
-#if 0
-void append __P((DB *, char **));
-#endif
-#ifdef STATISTICS
-void bstat __P((DB *, char **));
-#endif
-void cursor __P((DB *, char **));
-void delcur __P((DB *, char **));
-void delete __P((DB *, char **));
-#ifdef DEBUG
-void dump __P((DB *, char **));
-#endif
-void first __P((DB *, char **));
-void get __P((DB *, char **));
-void help __P((DB *, char **));
-void iafter __P((DB *, char **));
-void ibefore __P((DB *, char **));
-void icursor __P((DB *, char **));
-void insert __P((DB *, char **));
-void keydata __P((DBT *, DBT *));
-void last __P((DB *, char **));
-void list __P((DB *, char **));
-#if 0
-void load __P((DB *, char **));
-#endif
-#ifdef STATISTICS
-void mstat __P((DB *, char **));
-#endif
-void next __P((DB *, char **));
-int parse __P((char *, char **, int));
-void previous __P((DB *, char **));
-#ifdef DEBUG
-void show __P((DB *, char **));
-#endif
-void rlist __P((DB *, char **));
-void usage __P((void));
-void user __P((DB *));
-
-cmd_table commands[] = {
- "?", 0, 0, help, "help", NULL,
-#if 0
- "a", 2, 1, append, "append key def", "append key with data def",
-#endif
-#ifdef STATISTICS
- "b", 0, 0, bstat, "bstat", "stat btree",
-#endif
- "c", 1, 1, cursor, "cursor word", "move cursor to word",
- "delc", 0, 0, delcur, "delcur", "delete key the cursor references",
- "dele", 1, 1, delete, "delete word", "delete word",
-#ifdef DEBUG
- "d", 0, 0, dump, "dump", "dump database",
-#endif
- "f", 0, 0, first, "first", "move cursor to first record",
- "g", 1, 1, get, "get key", "locate key",
- "h", 0, 0, help, "help", "print command summary",
- "ia", 2, 1, iafter, "iafter key data", "insert data after key",
- "ib", 2, 1, ibefore, "ibefore key data", "insert data before key",
- "ic", 2, 1, icursor, "icursor key data", "replace cursor",
- "in", 2, 1, insert, "insert key def", "insert key with data def",
- "la", 0, 0, last, "last", "move cursor to last record",
- "li", 1, 1, list, "list file", "list to a file",
-#if 0
- "loa", 1, 0, load, "load file", NULL,
-#endif
- "loc", 1, 1, get, "get key", NULL,
-#ifdef STATISTICS
- "m", 0, 0, mstat, "mstat", "stat memory pool",
-#endif
- "n", 0, 0, next, "next", "move cursor forward one record",
- "p", 0, 0, previous, "previous", "move cursor back one record",
- "q", 0, 0, NULL, "quit", "quit",
- "rli", 1, 1, rlist, "rlist file", "list to a file (recursive)",
-#ifdef DEBUG
- "sh", 1, 0, show, "show page", "dump a page",
-#endif
- { NULL },
-};
-
-int recno; /* use record numbers */
-char *dict = "words"; /* default dictionary */
-char *progname;
-
-int
-main(argc, argv)
- int argc;
- char **argv;
-{
- int c;
- int omode;
- DB *db;
- BTREEINFO b;
-
- progname = *argv;
-
- omode = O_RDONLY;
- b.flags = 0;
- b.cachesize = 0;
- b.maxkeypage = 0;
- b.minkeypage = 0;
- b.psize = 0;
- b.compare = NULL;
- b.prefix = NULL;
- b.lorder = 0;
-
- while ((c = getopt(argc, argv, "bc:di:lp:ruw")) != -1) {
- switch (c) {
- case 'b':
- b.lorder = DB_BIG_ENDIAN;
- break;
- case 'c':
- b.cachesize = atoi(optarg);
- break;
- case 'd':
- b.flags |= R_DUP;
- break;
- case 'i':
- dict = optarg;
- break;
- case 'l':
- b.lorder = DB_LITTLE_ENDIAN;
- break;
- case 'p':
- b.psize = atoi(optarg);
- break;
- case 'r':
- recno = 1;
- break;
- case 'u':
- b.flags = 0;
- break;
- case 'w':
- omode = O_RDWR;
- break;
- default:
- usage();
- }
- }
- argc -= optind;
- argv += optind;
-
- if (recno)
- db = dbopen(*argv == NULL ? NULL : *argv, omode|O_BINARY,
- 0, DB_RECNO, NULL);
- else
- db = dbopen(*argv == NULL ? NULL : *argv, O_CREAT|omode|O_BINARY,
- 0600, DB_BTREE, &b);
-
- if (db == NULL) {
- (void)fprintf(stderr, "dbopen: %s\n", strerror(errno));
- exit(1);
- }
- globaldb = db;
- user(db);
- exit(0);
- /* NOTREACHED */
-}
-
-void
-user(db)
- DB *db;
-{
- FILE *ifp;
- int argc, i, last;
- char *lbuf, *argv[4], buf[512];
-
- if ((ifp = fopen("/dev/tty", "r")) == NULL) {
- (void)fprintf(stderr,
- "/dev/tty: %s\n", strerror(errno));
- exit(1);
- }
- for (last = 0;;) {
- (void)printf("> ");
- (void)fflush(stdout);
- if ((lbuf = fgets(&buf[0], 512, ifp)) == NULL)
- break;
- if (lbuf[0] == '\n') {
- i = last;
- goto uselast;
- }
- lbuf[strlen(lbuf) - 1] = '\0';
-
- if (lbuf[0] == 'q')
- break;
-
- argc = parse(lbuf, &argv[0], 3);
- if (argc == 0)
- continue;
-
- for (i = 0; commands[i].cmd != NULL; i++)
- if (strncmp(commands[i].cmd, argv[0],
- strlen(commands[i].cmd)) == 0)
- break;
-
- if (commands[i].cmd == NULL) {
- (void)fprintf(stderr,
- "%s: command unknown ('help' for help)\n", lbuf);
- continue;
- }
-
- if (commands[i].nargs != argc - 1) {
- (void)fprintf(stderr, "usage: %s\n", commands[i].usage);
- continue;
- }
-
- if (recno && commands[i].rconv) {
- static recno_t nlong;
- nlong = atoi(argv[1]);
- argv[1] = (char *)&nlong;
- }
-uselast: last = i;
- (*commands[i].func)(db, argv);
- }
- if ((db->sync)(db, 0) == RET_ERROR)
- perror("dbsync");
- else if ((db->close)(db) == RET_ERROR)
- perror("dbclose");
-}
-
-int
-parse(lbuf, argv, maxargc)
- char *lbuf, **argv;
- int maxargc;
-{
- int argc = 0;
- char *c;
-
- c = lbuf;
- while (isspace(*c))
- c++;
- while (*c != '\0' && argc < maxargc) {
- *argv++ = c;
- argc++;
- while (!isspace(*c) && *c != '\0') {
- c++;
- }
- while (isspace(*c))
- *c++ = '\0';
- }
- return (argc);
-}
-
-#if 0
-void
-append(db, argv)
- DB *db;
- char **argv;
-{
- DBT key, data;
- int status;
-
- if (!recno) {
- (void)fprintf(stderr,
- "append only available for recno db's.\n");
- return;
- }
- key.data = argv[1];
- key.size = sizeof(recno_t);
- data.data = argv[2];
- data.size = strlen(data.data);
- status = (db->put)(db, &key, &data, R_APPEND);
- switch (status) {
- case RET_ERROR:
- perror("append/put");
- break;
- case RET_SPECIAL:
- (void)printf("%s (duplicate key)\n", argv[1]);
- break;
- case RET_SUCCESS:
- break;
- }
-}
-#endif
-
-void
-cursor(db, argv)
- DB *db;
- char **argv;
-{
- DBT data, key;
- int status;
-
- key.data = argv[1];
- if (recno)
- key.size = sizeof(recno_t);
- else
- key.size = strlen(argv[1]) + 1;
- status = (*db->seq)(db, &key, &data, R_CURSOR);
- switch (status) {
- case RET_ERROR:
- perror("cursor/seq");
- break;
- case RET_SPECIAL:
- (void)printf("key not found\n");
- break;
- case RET_SUCCESS:
- keydata(&key, &data);
- break;
- }
-}
-
-void
-delcur(db, argv)
- DB *db;
- char **argv;
-{
- int status;
-
- status = (*db->del)(db, NULL, R_CURSOR);
-
- if (status == RET_ERROR)
- perror("delcur/del");
-}
-
-void
-delete(db, argv)
- DB *db;
- char **argv;
-{
- DBT key;
- int status;
-
- key.data = argv[1];
- if (recno)
- key.size = sizeof(recno_t);
- else
- key.size = strlen(argv[1]) + 1;
-
- status = (*db->del)(db, &key, 0);
- switch (status) {
- case RET_ERROR:
- perror("delete/del");
- break;
- case RET_SPECIAL:
- (void)printf("key not found\n");
- break;
- case RET_SUCCESS:
- break;
- }
-}
-
-#ifdef DEBUG
-void
-dump(db, argv)
- DB *db;
- char **argv;
-{
- __bt_dump(db);
-}
-#endif
-
-void
-first(db, argv)
- DB *db;
- char **argv;
-{
- DBT data, key;
- int status;
-
- status = (*db->seq)(db, &key, &data, R_FIRST);
-
- switch (status) {
- case RET_ERROR:
- perror("first/seq");
- break;
- case RET_SPECIAL:
- (void)printf("no more keys\n");
- break;
- case RET_SUCCESS:
- keydata(&key, &data);
- break;
- }
-}
-
-void
-get(db, argv)
- DB *db;
- char **argv;
-{
- DBT data, key;
- int status;
-
- key.data = argv[1];
- if (recno)
- key.size = sizeof(recno_t);
- else
- key.size = strlen(argv[1]) + 1;
-
- status = (*db->get)(db, &key, &data, 0);
-
- switch (status) {
- case RET_ERROR:
- perror("get/get");
- break;
- case RET_SPECIAL:
- (void)printf("key not found\n");
- break;
- case RET_SUCCESS:
- keydata(&key, &data);
- break;
- }
-}
-
-void
-help(db, argv)
- DB *db;
- char **argv;
-{
- int i;
-
- for (i = 0; commands[i].cmd; i++)
- if (commands[i].descrip)
- (void)printf("%s: %s\n",
- commands[i].usage, commands[i].descrip);
-}
-
-void
-iafter(db, argv)
- DB *db;
- char **argv;
-{
- DBT key, data;
- int status;
-
- if (!recno) {
- (void)fprintf(stderr,
- "iafter only available for recno db's.\n");
- return;
- }
- key.data = argv[1];
- key.size = sizeof(recno_t);
- data.data = argv[2];
- data.size = strlen(data.data);
- status = (db->put)(db, &key, &data, R_IAFTER);
- switch (status) {
- case RET_ERROR:
- perror("iafter/put");
- break;
- case RET_SPECIAL:
- (void)printf("%s (duplicate key)\n", argv[1]);
- break;
- case RET_SUCCESS:
- break;
- }
-}
-
-void
-ibefore(db, argv)
- DB *db;
- char **argv;
-{
- DBT key, data;
- int status;
-
- if (!recno) {
- (void)fprintf(stderr,
- "ibefore only available for recno db's.\n");
- return;
- }
- key.data = argv[1];
- key.size = sizeof(recno_t);
- data.data = argv[2];
- data.size = strlen(data.data);
- status = (db->put)(db, &key, &data, R_IBEFORE);
- switch (status) {
- case RET_ERROR:
- perror("ibefore/put");
- break;
- case RET_SPECIAL:
- (void)printf("%s (duplicate key)\n", argv[1]);
- break;
- case RET_SUCCESS:
- break;
- }
-}
-
-void
-icursor(db, argv)
- DB *db;
- char **argv;
-{
- int status;
- DBT data, key;
-
- key.data = argv[1];
- if (recno)
- key.size = sizeof(recno_t);
- else
- key.size = strlen(argv[1]) + 1;
- data.data = argv[2];
- data.size = strlen(argv[2]) + 1;
-
- status = (*db->put)(db, &key, &data, R_CURSOR);
- switch (status) {
- case RET_ERROR:
- perror("icursor/put");
- break;
- case RET_SPECIAL:
- (void)printf("%s (duplicate key)\n", argv[1]);
- break;
- case RET_SUCCESS:
- break;
- }
-}
-
-void
-insert(db, argv)
- DB *db;
- char **argv;
-{
- int status;
- DBT data, key;
-
- key.data = argv[1];
- if (recno)
- key.size = sizeof(recno_t);
- else
- key.size = strlen(argv[1]) + 1;
- data.data = argv[2];
- data.size = strlen(argv[2]) + 1;
-
- status = (*db->put)(db, &key, &data, R_NOOVERWRITE);
- switch (status) {
- case RET_ERROR:
- perror("insert/put");
- break;
- case RET_SPECIAL:
- (void)printf("%s (duplicate key)\n", argv[1]);
- break;
- case RET_SUCCESS:
- break;
- }
-}
-
-void
-last(db, argv)
- DB *db;
- char **argv;
-{
- DBT data, key;
- int status;
-
- status = (*db->seq)(db, &key, &data, R_LAST);
-
- switch (status) {
- case RET_ERROR:
- perror("last/seq");
- break;
- case RET_SPECIAL:
- (void)printf("no more keys\n");
- break;
- case RET_SUCCESS:
- keydata(&key, &data);
- break;
- }
-}
-
-void
-list(db, argv)
- DB *db;
- char **argv;
-{
- DBT data, key;
- FILE *fp;
- int status;
-
- if ((fp = fopen(argv[1], "w")) == NULL) {
- (void)fprintf(stderr, "%s: %s\n", argv[1], strerror(errno));
- return;
- }
- status = (*db->seq)(db, &key, &data, R_FIRST);
- while (status == RET_SUCCESS) {
- (void)fprintf(fp, "%s\n", key.data);
- status = (*db->seq)(db, &key, &data, R_NEXT);
- }
- (void)fclose(fp);
- if (status == RET_ERROR)
- perror("list/seq");
-}
-
-void
-rlist(db, argv)
- DB *db;
- char **argv;
-{
- DBT data, key;
- FILE *fp;
- int status;
- void *cookie;
-
- cookie = NULL;
- if ((fp = fopen(argv[1], "w")) == NULL) {
- (void)fprintf(stderr, "%s: %s\n", argv[1], strerror(errno));
- return;
- }
- status = bt_rseq(db, &key, &data, &cookie, R_FIRST);
- while (status == RET_SUCCESS) {
- (void)fprintf(fp, "%s\n", key.data);
- status = bt_rseq(db, &key, &data, &cookie, R_NEXT);
- }
- (void)fclose(fp);
- if (status == RET_ERROR)
- perror("list/seq");
-}
-
-#if 0
-DB *BUGdb;
-void
-load(db, argv)
- DB *db;
- char **argv;
-{
- register char *p, *t;
- FILE *fp;
- DBT data, key;
- recno_t cnt;
- size_t len;
- int status;
- char *lp, buf[16 * 1024];
-
- BUGdb = db;
- if ((fp = fopen(argv[1], "r")) == NULL) {
- (void)fprintf(stderr, "%s: %s\n", argv[1], strerror(errno));
- return;
- }
- (void)printf("loading %s...\n", argv[1]);
-
- for (cnt = 1; (lp = fgetline(fp, &len)) != NULL; ++cnt) {
- if (recno) {
- key.data = &cnt;
- key.size = sizeof(recno_t);
- data.data = lp;
- data.size = len + 1;
- } else {
- key.data = lp;
- key.size = len + 1;
- for (p = lp + len - 1, t = buf; p >= lp; *t++ = *p--);
- *t = '\0';
- data.data = buf;
- data.size = len + 1;
- }
-
- status = (*db->put)(db, &key, &data, R_NOOVERWRITE);
- switch (status) {
- case RET_ERROR:
- perror("load/put");
- exit(1);
- case RET_SPECIAL:
- if (recno)
- (void)fprintf(stderr,
- "duplicate: %ld {%s}\n", cnt, data.data);
- else
- (void)fprintf(stderr,
- "duplicate: %ld {%s}\n", cnt, key.data);
- exit(1);
- case RET_SUCCESS:
- break;
- }
- }
- (void)fclose(fp);
-}
-#endif
-
-void
-next(db, argv)
- DB *db;
- char **argv;
-{
- DBT data, key;
- int status;
-
- status = (*db->seq)(db, &key, &data, R_NEXT);
-
- switch (status) {
- case RET_ERROR:
- perror("next/seq");
- break;
- case RET_SPECIAL:
- (void)printf("no more keys\n");
- break;
- case RET_SUCCESS:
- keydata(&key, &data);
- break;
- }
-}
-
-void
-previous(db, argv)
- DB *db;
- char **argv;
-{
- DBT data, key;
- int status;
-
- status = (*db->seq)(db, &key, &data, R_PREV);
-
- switch (status) {
- case RET_ERROR:
- perror("previous/seq");
- break;
- case RET_SPECIAL:
- (void)printf("no more keys\n");
- break;
- case RET_SUCCESS:
- keydata(&key, &data);
- break;
- }
-}
-
-#ifdef DEBUG
-void
-show(db, argv)
- DB *db;
- char **argv;
-{
- BTREE *t;
- PAGE *h;
- db_pgno_t pg;
-
- pg = atoi(argv[1]);
- t = db->internal;
- if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL) {
- (void)printf("getpage of %ld failed\n", pg);
- return;
- }
- if (pg == 0)
- __bt_dmpage(h);
- else
- __bt_dpage(db, h);
- mpool_put(t->bt_mp, h, 0);
-}
-#endif
-
-#ifdef STATISTICS
-void
-bstat(db, argv)
- DB *db;
- char **argv;
-{
- (void)printf("BTREE\n");
- __bt_stat(db);
-}
-
-void
-mstat(db, argv)
- DB *db;
- char **argv;
-{
- (void)printf("MPOOL\n");
- mpool_stat(((BTREE *)db->internal)->bt_mp);
-}
-#endif
-
-void
-keydata(key, data)
- DBT *key, *data;
-{
- if (!recno && key->size > 0)
- (void)printf("%s/", key->data);
- if (data->size > 0)
- (void)printf("%s", data->data);
- (void)printf("\n");
-}
-
-void
-usage()
-{
- (void)fprintf(stderr,
- "usage: %s [-bdluw] [-c cache] [-i file] [-p page] [file]\n",
- progname);
- exit (1);
-}
diff --git a/src/util/db2/test/dbtest.c b/src/util/db2/test/dbtest.c
deleted file mode 100644
index 10a89a6fad..0000000000
--- a/src/util/db2/test/dbtest.c
+++ /dev/null
@@ -1,768 +0,0 @@
-/*-
- * Copyright (c) 1992, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if !defined(lint) && defined(LIBC_SCCS)
-static char copyright[] =
-"@(#) Copyright (c) 1992, 1993, 1994\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#if !defined(lint) && defined(LIBC_SCCS)
-static char sccsid[] = "@(#)dbtest.c 8.17 (Berkeley) 9/1/94";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/stat.h>
-
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "db-int.h"
-#ifdef STATISTICS
-#include "btree.h"
-#endif
-
-enum S { COMMAND, COMPARE, GET, PUT, REMOVE, SEQ, SEQFLAG, KEY, DATA };
-
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
-#define ATTR(x) __attribute__(x)
-#else
-#define ATTR(x)
-#endif
-
-void compare __P((DBT *, DBT *));
-DBTYPE dbtype __P((char *));
-void dump __P((DB *, int));
-void err __P((const char *, ...)) ATTR ((__format__(__printf__,1,2))) ATTR ((__noreturn__));
-void get __P((DB *, DBT *));
-void getdata __P((DB *, DBT *, DBT *));
-void put __P((DB *, DBT *, DBT *));
-void rem __P((DB *, DBT *));
-char *sflags __P((int));
-void synk __P((DB *));
-void *rfile __P((char *, size_t *));
-void seq __P((DB *, DBT *));
-u_int setflags __P((char *));
-void *setinfo __P((DBTYPE, char *));
-void usage __P((void));
-void *xmalloc __P((char *, size_t));
-
-DBTYPE type; /* Database type. */
-void *infop; /* Iflags. */
-u_long lineno; /* Current line in test script. */
-u_int flags; /* Current DB flags. */
-int ofd = STDOUT_FILENO; /* Standard output fd. */
-
-DB *XXdbp; /* Global for gdb. */
-int XXlineno; /* Fast breakpoint for gdb. */
-
-int
-main(argc, argv)
- int argc;
- char *argv[];
-{
- extern int optind;
- extern char *optarg;
- enum S command, state;
- DB *dbp;
- DBT data, key, keydata;
- size_t len;
- int ch, oflags, sflag;
- char *fname, *infoarg, *p, *t, buf[8 * 1024];
-
- infoarg = NULL;
- fname = NULL;
- oflags = O_CREAT | O_RDWR | O_BINARY;
- sflag = 0;
- while ((ch = getopt(argc, argv, "f:i:lo:s")) != -1)
- switch (ch) {
- case 'f':
- fname = optarg;
- break;
- case 'i':
- infoarg = optarg;
- break;
- case 'l':
- oflags |= DB_LOCK;
- break;
- case 'o':
- if ((ofd = open(optarg,
- O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0)
- err("%s: %s", optarg, strerror(errno));
- break;
- case 's':
- sflag = 1;
- break;
- case '?':
- default:
- usage();
- }
- argc -= optind;
- argv += optind;
-
- if (argc != 2)
- usage();
-
- /* Set the type. */
- type = dbtype(*argv++);
-
- /* Open the descriptor file. */
- if (strcmp(*argv, "-") && freopen(*argv, "r", stdin) == NULL)
- err("%s: %s", *argv, strerror(errno));
-
- /* Set up the db structure as necessary. */
- if (infoarg == NULL)
- infop = NULL;
- else
- for (p = strtok(infoarg, ",\t "); p != NULL;
- p = strtok(0, ",\t "))
- if (*p != '\0')
- infop = setinfo(type, p);
-
- /*
- * Open the DB. Delete any preexisting copy, you almost never
- * want it around, and it often screws up tests.
- */
- if (fname == NULL) {
- p = getenv("TMPDIR");
- if (p == NULL)
- p = "/var/tmp";
- (void)sprintf(buf, "%s/__dbtest", p);
- fname = buf;
- (void)unlink(buf);
- } else if (!sflag)
- (void)unlink(fname);
-
- if ((dbp = dbopen(fname,
- oflags, S_IRUSR | S_IWUSR, type, infop)) == NULL)
- err("dbopen: %s", strerror(errno));
- XXdbp = dbp;
-
- state = COMMAND;
- for (lineno = 1;
- (p = fgets(buf, sizeof(buf), stdin)) != NULL; ++lineno) {
- /* Delete the newline, displaying the key/data is easier. */
- if (ofd == STDOUT_FILENO && (t = strchr(p, '\n')) != NULL)
- *t = '\0';
- if ((len = strlen(buf)) == 0 || isspace((int) *p) || *p == '#')
- continue;
-
- /* Convenient gdb break point. */
- if (XXlineno == lineno)
- XXlineno = 1;
- switch (*p) {
- case 'c': /* compare */
- if (state != COMMAND)
- err("line %lu: not expecting command", lineno);
- state = KEY;
- command = COMPARE;
- break;
- case 'e': /* echo */
- if (state != COMMAND)
- err("line %lu: not expecting command", lineno);
- /* Don't display the newline, if CR at EOL. */
- if (p[len - 2] == '\r')
- --len;
- if (write(ofd, p + 1, len - 1) != len - 1 ||
- write(ofd, "\n", 1) != 1)
- err("write: %s", strerror(errno));
- break;
- case 'g': /* get */
- if (state != COMMAND)
- err("line %lu: not expecting command", lineno);
- state = KEY;
- command = GET;
- break;
- case 'p': /* put */
- if (state != COMMAND)
- err("line %lu: not expecting command", lineno);
- state = KEY;
- command = PUT;
- break;
- case 'r': /* remove */
- if (state != COMMAND)
- err("line %lu: not expecting command", lineno);
- if (flags == R_CURSOR) {
- rem(dbp, &key);
- state = COMMAND;
- } else {
- state = KEY;
- command = REMOVE;
- }
- break;
- case 'S': /* sync */
- if (state != COMMAND)
- err("line %lu: not expecting command", lineno);
- synk(dbp);
- state = COMMAND;
- break;
- case 's': /* seq */
- if (state != COMMAND)
- err("line %lu: not expecting command", lineno);
- if (flags == R_CURSOR) {
- state = KEY;
- command = SEQ;
- } else
- seq(dbp, &key);
- break;
- case 'f':
- flags = setflags(p + 1);
- break;
- case 'D': /* data file */
- if (state != DATA)
- err("line %lu: not expecting data", lineno);
- data.data = rfile(p + 1, &data.size);
- goto ldata;
- case 'd': /* data */
- if (state != DATA)
- err("line %lu: not expecting data", lineno);
- data.data = xmalloc(p + 1, len - 1);
- data.size = len - 1;
-ldata: switch (command) {
- case COMPARE:
- compare(&keydata, &data);
- break;
- case PUT:
- put(dbp, &key, &data);
- break;
- default:
- err("line %lu: command doesn't take data",
- lineno);
- }
- if (type != DB_RECNO)
- free(key.data);
- free(data.data);
- state = COMMAND;
- break;
- case 'K': /* key file */
- if (state != KEY)
- err("line %lu: not expecting a key", lineno);
- if (type == DB_RECNO)
- err("line %lu: 'K' not available for recno",
- lineno);
- key.data = rfile(p + 1, &key.size);
- goto lkey;
- case 'k': /* key */
- if (state != KEY)
- err("line %lu: not expecting a key", lineno);
- if (type == DB_RECNO) {
- static recno_t recno;
- recno = atoi(p + 1);
- key.data = &recno;
- key.size = sizeof(recno);
- } else {
- key.data = xmalloc(p + 1, len - 1);
- key.size = len - 1;
- }
-lkey: switch (command) {
- case COMPARE:
- getdata(dbp, &key, &keydata);
- state = DATA;
- break;
- case GET:
- get(dbp, &key);
- if (type != DB_RECNO)
- free(key.data);
- state = COMMAND;
- break;
- case PUT:
- state = DATA;
- break;
- case REMOVE:
- rem(dbp, &key);
- if ((type != DB_RECNO) && (flags != R_CURSOR))
- free(key.data);
- state = COMMAND;
- break;
- case SEQ:
- seq(dbp, &key);
- if ((type != DB_RECNO) && (flags != R_CURSOR))
- free(key.data);
- state = COMMAND;
- break;
- default:
- err("line %lu: command doesn't take a key",
- lineno);
- }
- break;
- case 'o':
- dump(dbp, p[1] == 'r');
- break;
- default:
- err("line %lu: %s: unknown command character",
- lineno, p);
- }
- }
-#ifdef STATISTICS
- /*
- * -l must be used (DB_LOCK must be set) for this to be
- * used, otherwise a page will be locked and it will fail.
- */
- if (type == DB_BTREE && oflags & DB_LOCK)
- __bt_stat(dbp);
-#endif
- if (dbp->close(dbp))
- err("db->close: %s", strerror(errno));
- (void)close(ofd);
- exit(0);
-}
-
-#define NOOVERWRITE "put failed, would overwrite key\n"
-
-void
-compare(db1, db2)
- DBT *db1, *db2;
-{
- register size_t len;
- register u_char *p1, *p2;
-
- if (db1->size != db2->size) {
- printf("compare failed: key->data len %lu != data len %lu\n",
- (u_long) db1->size, (u_long) db2->size);
- exit (1);
- }
-
- len = MIN(db1->size, db2->size);
- for (p1 = db1->data, p2 = db2->data; len--;)
- if (*p1++ != *p2++) {
- err("compare failed at offset %d\n",
- p1 - (u_char *)db1->data);
- break;
- }
-}
-
-void
-get(dbp, kp)
- DB *dbp;
- DBT *kp;
-{
- DBT data;
-
- switch (dbp->get(dbp, kp, &data, flags)) {
- case 0:
- (void)write(ofd, data.data, data.size);
- if (ofd == STDOUT_FILENO)
- (void)write(ofd, "\n", 1);
- break;
- case -1:
- err("line %lu: get: %s", lineno, strerror(errno));
- /* NOTREACHED */
- case 1:
-#define NOSUCHKEY "get failed, no such key\n"
- if (ofd != STDOUT_FILENO) {
- (void)write(ofd, NOSUCHKEY, sizeof(NOSUCHKEY) - 1);
- exit(1);
- } else
- (void)fprintf(stderr, "%lu: %.*s: %s",
- lineno, (int) MIN(kp->size, 20), (char *) kp->data,
- NOSUCHKEY);
-#undef NOSUCHKEY
- break;
- }
-}
-
-void
-getdata(dbp, kp, dp)
- DB *dbp;
- DBT *kp, *dp;
-{
- switch (dbp->get(dbp, kp, dp, flags)) {
- case 0:
- return;
- case -1:
- err("line %lu: getdata: %s", lineno, strerror(errno));
- /* NOTREACHED */
- case 1:
- err("line %lu: getdata failed, no such key", lineno);
- /* NOTREACHED */
- }
-}
-
-void
-put(dbp, kp, dp)
- DB *dbp;
- DBT *kp, *dp;
-{
- switch (dbp->put(dbp, kp, dp, flags)) {
- case 0:
- break;
- case -1:
- err("line %lu: put: %s", lineno, strerror(errno));
- /* NOTREACHED */
- case 1:
- (void)write(ofd, NOOVERWRITE, sizeof(NOOVERWRITE) - 1);
- break;
- }
-}
-
-void
-rem(dbp, kp)
- DB *dbp;
- DBT *kp;
-{
- switch (dbp->del(dbp, kp, flags)) {
- case 0:
- break;
- case -1:
- err("line %lu: rem: %s", lineno, strerror(errno));
- /* NOTREACHED */
- case 1:
-#define NOSUCHKEY "rem failed, no such key\n"
- if (ofd != STDOUT_FILENO)
- (void)write(ofd, NOSUCHKEY, sizeof(NOSUCHKEY) - 1);
- else if (flags != R_CURSOR)
- (void)fprintf(stderr, "%lu: %.*s: %s",
- lineno, (int) MIN(kp->size, 20), (char *) kp->data,
- NOSUCHKEY);
- else
- (void)fprintf(stderr,
- "%lu: rem of cursor failed\n", lineno);
-#undef NOSUCHKEY
- break;
- }
-}
-
-void
-synk(dbp)
- DB *dbp;
-{
- switch (dbp->sync(dbp, flags)) {
- case 0:
- break;
- case -1:
- err("line %lu: synk: %s", lineno, strerror(errno));
- /* NOTREACHED */
- }
-}
-
-void
-seq(dbp, kp)
- DB *dbp;
- DBT *kp;
-{
- DBT data;
-
- switch (dbp->seq(dbp, kp, &data, flags)) {
- case 0:
- (void)write(ofd, data.data, data.size);
- if (ofd == STDOUT_FILENO)
- (void)write(ofd, "\n", 1);
- break;
- case -1:
- err("line %lu: seq: %s", lineno, strerror(errno));
- /* NOTREACHED */
- case 1:
-#define NOSUCHKEY "seq failed, no such key\n"
- if (ofd != STDOUT_FILENO)
- (void)write(ofd, NOSUCHKEY, sizeof(NOSUCHKEY) - 1);
- else if (flags == R_CURSOR)
- (void)fprintf(stderr, "%lu: %.*s: %s",
- lineno, (int) MIN(kp->size, 20), (char *) kp->data,
- NOSUCHKEY);
- else
- (void)fprintf(stderr,
- "%lu: seq (%s) failed\n", lineno, sflags(flags));
-#undef NOSUCHKEY
- break;
- }
-}
-
-void
-dump(dbp, rev)
- DB *dbp;
- int rev;
-{
- DBT key, data;
- int lflags, nflags;
-
- if (rev) {
- lflags = R_LAST;
- nflags = R_PREV;
- } else {
- lflags = R_FIRST;
- nflags = R_NEXT;
- }
- for (;; lflags = nflags)
- switch (dbp->seq(dbp, &key, &data, lflags)) {
- case 0:
- (void)write(ofd, data.data, data.size);
- if (ofd == STDOUT_FILENO)
- (void)write(ofd, "\n", 1);
- break;
- case 1:
- goto done;
- case -1:
- err("line %lu: (dump) seq: %s",
- lineno, strerror(errno));
- /* NOTREACHED */
- }
-done: return;
-}
-
-u_int
-setflags(s)
- char *s;
-{
- char *p;
-
- for (; isspace((int) *s); ++s);
- if (*s == '\n' || *s == '\0')
- return (0);
- if ((p = strchr(s, '\n')) != NULL)
- *p = '\0';
- if (!strcmp(s, "R_CURSOR")) return (R_CURSOR);
- if (!strcmp(s, "R_FIRST")) return (R_FIRST);
- if (!strcmp(s, "R_IAFTER")) return (R_IAFTER);
- if (!strcmp(s, "R_IBEFORE")) return (R_IBEFORE);
- if (!strcmp(s, "R_LAST")) return (R_LAST);
- if (!strcmp(s, "R_NEXT")) return (R_NEXT);
- if (!strcmp(s, "R_NOOVERWRITE")) return (R_NOOVERWRITE);
- if (!strcmp(s, "R_PREV")) return (R_PREV);
- if (!strcmp(s, "R_SETCURSOR")) return (R_SETCURSOR);
-
- err("line %lu: %s: unknown flag", lineno, s);
- /* NOTREACHED */
-}
-
-char *
-sflags(lflags)
- int lflags;
-{
- switch (lflags) {
- case R_CURSOR: return ("R_CURSOR");
- case R_FIRST: return ("R_FIRST");
- case R_IAFTER: return ("R_IAFTER");
- case R_IBEFORE: return ("R_IBEFORE");
- case R_LAST: return ("R_LAST");
- case R_NEXT: return ("R_NEXT");
- case R_NOOVERWRITE: return ("R_NOOVERWRITE");
- case R_PREV: return ("R_PREV");
- case R_SETCURSOR: return ("R_SETCURSOR");
- }
-
- return ("UNKNOWN!");
-}
-
-DBTYPE
-dbtype(s)
- char *s;
-{
- if (!strcmp(s, "btree"))
- return (DB_BTREE);
- if (!strcmp(s, "hash"))
- return (DB_HASH);
- if (!strcmp(s, "recno"))
- return (DB_RECNO);
- err("%s: unknown type (use btree, hash or recno)", s);
- /* NOTREACHED */
-}
-
-void *
-setinfo(db_type, s)
- DBTYPE db_type;
- char *s;
-{
- static BTREEINFO ib;
- static HASHINFO ih;
- static RECNOINFO rh;
- char *eq;
-
- if ((eq = strchr(s, '=')) == NULL)
- err("%s: illegal structure set statement", s);
- *eq++ = '\0';
- if (!isdigit((int) *eq))
- err("%s: structure set statement must be a number", s);
-
- switch (db_type) {
- case DB_BTREE:
- if (!strcmp("flags", s)) {
- ib.flags = atoi(eq);
- return (&ib);
- }
- if (!strcmp("cachesize", s)) {
- ib.cachesize = atoi(eq);
- return (&ib);
- }
- if (!strcmp("maxkeypage", s)) {
- ib.maxkeypage = atoi(eq);
- return (&ib);
- }
- if (!strcmp("minkeypage", s)) {
- ib.minkeypage = atoi(eq);
- return (&ib);
- }
- if (!strcmp("lorder", s)) {
- ib.lorder = atoi(eq);
- return (&ib);
- }
- if (!strcmp("psize", s)) {
- ib.psize = atoi(eq);
- return (&ib);
- }
- break;
- case DB_HASH:
- if (!strcmp("bsize", s)) {
- ih.bsize = atoi(eq);
- return (&ih);
- }
- if (!strcmp("ffactor", s)) {
- ih.ffactor = atoi(eq);
- return (&ih);
- }
- if (!strcmp("nelem", s)) {
- ih.nelem = atoi(eq);
- return (&ih);
- }
- if (!strcmp("cachesize", s)) {
- ih.cachesize = atoi(eq);
- return (&ih);
- }
- if (!strcmp("lorder", s)) {
- ih.lorder = atoi(eq);
- return (&ih);
- }
- break;
- case DB_RECNO:
- if (!strcmp("flags", s)) {
- rh.flags = atoi(eq);
- return (&rh);
- }
- if (!strcmp("cachesize", s)) {
- rh.cachesize = atoi(eq);
- return (&rh);
- }
- if (!strcmp("lorder", s)) {
- rh.lorder = atoi(eq);
- return (&rh);
- }
- if (!strcmp("reclen", s)) {
- rh.reclen = atoi(eq);
- return (&rh);
- }
- if (!strcmp("bval", s)) {
- rh.bval = atoi(eq);
- return (&rh);
- }
- if (!strcmp("psize", s)) {
- rh.psize = atoi(eq);
- return (&rh);
- }
- break;
- }
- err("%s: unknown structure value", s);
- /* NOTREACHED */
-}
-
-void *
-rfile(name, lenp)
- char *name;
- size_t *lenp;
-{
- struct stat sb;
- void *p;
- int fd;
- char *np;
-
- for (; isspace((int) *name); ++name);
- if ((np = strchr(name, '\n')) != NULL)
- *np = '\0';
- if ((fd = open(name, O_RDONLY, 0)) < 0 ||
- fstat(fd, &sb))
- err("%s: %s\n", name, strerror(errno));
-#ifdef NOT_PORTABLE
- if (sb.st_size > (off_t)SIZE_T_MAX)
- err("%s: %s\n", name, strerror(E2BIG));
-#endif
- if ((p = (void *)malloc((u_int)sb.st_size)) == NULL)
- err("%s", strerror(errno));
- (void)read(fd, p, (int)sb.st_size);
- *lenp = sb.st_size;
- (void)close(fd);
- return (p);
-}
-
-void *
-xmalloc(text, len)
- char *text;
- size_t len;
-{
- void *p;
-
- if ((p = (void *)malloc(len)) == NULL)
- err("%s", strerror(errno));
- memmove(p, text, len);
- return (p);
-}
-
-void
-usage()
-{
- (void)fprintf(stderr,
- "usage: dbtest [-l] [-f file] [-i info] [-o file] type script\n");
- exit(1);
-}
-
-#ifdef __STDC__
-#include <stdarg.h>
-#else
-#include <varargs.h>
-#endif
-
-void
-#ifdef __STDC__
-err(const char *fmt, ...)
-#else
-err(fmt, va_alist)
- char *fmt;
- va_dcl
-#endif
-{
- va_list ap;
-#ifdef __STDC__
- va_start(ap, fmt);
-#else
- va_start(ap);
-#endif
- (void)fprintf(stderr, "dbtest: ");
- (void)vfprintf(stderr, fmt, ap);
- va_end(ap);
- (void)fprintf(stderr, "\n");
- exit(1);
- /* NOTREACHED */
-}
diff --git a/src/util/db2/test/dictionary b/src/util/db2/test/dictionary
deleted file mode 100644
index 53640f0164..0000000000
--- a/src/util/db2/test/dictionary
+++ /dev/null
@@ -1,308 +0,0 @@
-abintrme
-ablatweo
-agdbevea
-aglamber
-aicehayt
-alerover
-anadanth
-ancmirtt
-ancthada
-angcther
-antasikt
-arathmsm
-arescofa
-arthatea
-asallyth
-asathedl
-ascelass
-athaneal
-atheneri
-atheryit
-athiopep
-athysidc
-atyhtiti
-auletard
-aytthepr
-bedthesa
-beiofttw
-bemofrda
-bertedud
-bessdide
-bestiemb
-blllanof
-bllssunt
-blstther
-bttelthh
-bulyousi
-bupedire
-buseatsd
-butritat
-byeditam
-cedvecur
-censaith
-centhfro
-centitar
-ceourire
-cetheaso
-chancora
-chavengl
-chederas
-chemsywh
-civadayo
-ckedacag
-ckstiptr
-colither
-congchin
-corepppl
-cronoria
-cthilath
-cthouthe
-ctofowon
-cumetbry
-dbethere
-degeerin
-detherai
-dingthin
-dryslyse
-dscesild
-ealecerm
-edftserh
-efosondi
-eherrreg
-emidesja
-ereananm
-estersns
-etedtili
-evermerh
-falsuran
-faringsi
-fawerist
-fcedethe
-fedhessh
-fedlerca
-feupbori
-ffeedift
-fllbasia
-foftabll
-fomehage
-fotsenki
-fwisudls
-ggeuptha
-gswofryt
-hedcecou
-hereacun
-huvedpth
-iabengre
-ianfovin
-iaresice
-iasmived
-idengedi
-ilftisut
-ilinefem
-imeorran
-imsstoft
-inararto
-indanrei
-ingelaly
-ingeored
-inmotiom
-inoatlfr
-inoviler
-insedihe
-intaspan
-intowade
-inyfeprt
-iobloinc
-ionepuse
-iourofig
-ireeingi
-irreland
-irsfandb
-isewhell
-isocisad
-isriacth
-istaverr
-ithmblet
-itoingri
-itongala
-itsgrint
-ivyttisa
-laltthea
-lanesmef
-lanonepi
-lerithay
-lllmeris
-lysatspa
-lysceert
-masishio
-mathmmat
-meastrei
-medengny
-medwindb
-membonam
-moronash
-mpeotlin
-msomirei
-msrmstri
-mstirtis
-nbempeef
-ncheckno
-nddtthec
-ndilymor
-nditheiv
-ndoncath
-nenkingo
-ngryasth
-nichelnd
-nndarrof
-nongeatt
-noviearc
-npecheca
-nsttmema
-nwiowhan
-oalsaldt
-obullury
-odtenens
-offorind
-ofoditin
-ogarofab
-olossofe
-olspooth
-omajorul
-omantrvi
-omawevat
-onotorit
-oorendbe
-oosarang
-othowong
-otinffte
-ouatheno
-ountshep
-ouputope
-owhesatu
-owiaindh
-padisath
-pangream
-pawicofa
-pendamam
-pepofond
-peroncti
-perysege
-petotith
-plocarov
-pomasbor
-powholyi
-ppllosof
-pptinoma
-psenesff
-puiondit
-reestand
-rendlabl
-rerathsy
-rewathat
-rirndiff
-ritricui
-samasome
-satameer
-sathecur
-sbespral
-sconbeis
-sedfinhe
-sharveon
-shhoftrd
-sianthem
-sieaveve
-simedera
-sinandff
-sinulsma
-sllobofl
-sndfermh
-soffatic
-soingris
-songiorb
-sthottsa
-suewemat
-swicales
-tagttisf
-tanalatt
-tancodbo
-tarethal
-tbisesia
-teftyall
-tengstwh
-tepeshth
-teranand
-tevinohi
-tgthehal
-thansirs
-thecequs
-thereaco
-therimut
-therorea
-thestiom
-theveame
-thhastth
-thiasatt
-thidirve
-thingbaa
-thithbed
-thovires
-thswenpe
-thublthe
-tiamarss
-tincthes
-tindtofo
-tinedave
-tisanwex
-tlarnste
-tleicorb
-tnymesie
-toftemal
-tombeasw
-torarsen
-totheheo
-toudanty
-tremywel
-treonove
-trhandfy
-trrhmont
-trysnter
-tssasofo
-ttemaith
-ttiserds
-ttorissa
-tuiabeoi
-twirfton
-tyhentha
-tyngorti
-tyoarich
-ucatbouc
-ungyconh
-untinore
-uopsaren
-upecmuit
-ureaidrb
-usinittr
-ussofedt
-usunochp
-utbapofo
-veveplel
-vimathea
-walondui
-wavairet
-waysioft
-wceempil
-wealttig
-wefondio
-werdtian
-weswevar
-whaclthe
-wheanler
-wheiforv
-whisurtr
-whrithat
-wiesulci
-wirofrec
-witthile
-wtserodr
-ybutherr
diff --git a/src/util/db2/test/hash1.tests/Makefile b/src/util/db2/test/hash1.tests/Makefile
deleted file mode 100644
index 348a8f818b..0000000000
--- a/src/util/db2/test/hash1.tests/Makefile
+++ /dev/null
@@ -1,43 +0,0 @@
-# @(#)Makefile 8.16 (Berkeley) 11/20/95
-
-ALL = driver2 tcreat3 tdel thash4 tread2 tseq tverify
-OBJ = driver2.o tcreat3.o tdel.o thash4.o tread2.o tseq.o tverify.o
-CC = gcc
-
-all: ${ALL}
-
-# Uncomment the STAT line get hash and btree statistical use info. This
-# also forces ld to load the btree debug functions for use by gdb, which
-# is useful. The db library has to be compiled with -DSTATISTICS as well.
-INC= -I${PORTDIR}/include -I${PORTDIR}
-OORG= -g
-#STAT= -DSTATISTICS
-CFLAGS= -D__DBINTERFACE_PRIVATE -DDEBUG ${STAT} ${OORG} ${INC}
-
-tcreat3: tcreat3.o ${PORTDIR}/libdb.a
- ${CC} -o $@ tcreat3.o ${PORTDIR}/libdb.a
-
-tdel: tdel.o ${PORTDIR}/libdb.a
- ${CC} -o $@ tdel.o ${PORTDIR}/libdb.a
-
-thash4: thash4.o ${PORTDIR}/libdb.a
- ${CC} -o $@ thash4.o ${PORTDIR}/libdb.a
-
-tread2: tread2.o ${PORTDIR}/libdb.a
- ${CC} -o $@ tread2.o ${PORTDIR}/libdb.a
-
-tseq: tseq.o ${PORTDIR}/libdb.a
- ${CC} -o $@ tseq.o ${PORTDIR}/libdb.a
-
-tverify: tverify.o ${PORTDIR}/libdb.a
- ${CC} -o $@ tverify.o ${PORTDIR}/libdb.a
-
-driver2: driver2.o ${PORTDIR}/libdb.a
- ${CC} -o $@ driver2.o ${PORTDIR}/libdb.a
-
-strerror.o: ${PORTDIR}/clib/strerror.c
- ${CC} -c ${PORTDIR}/clib/strerror.c
-
-clean:
- rm -f *.core gmon.out ${ALL} ${OBJ} t1 t2 t3
-
diff --git a/src/util/db2/test/hash1.tests/driver2.c b/src/util/db2/test/hash1.tests/driver2.c
deleted file mode 100644
index 6a3b432cb6..0000000000
--- a/src/util/db2/test/hash1.tests/driver2.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Margo Seltzer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1991, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static char sccsid[] = "@(#)driver2.c 8.1 (Berkeley) 6/4/93";
-#endif /* not lint */
-
-/*
- * Test driver, to try to tackle the large ugly-split problem.
- */
-
-#include <sys/file.h>
-#include <stdio.h>
-#include "ndbm.h"
-
-int my_hash(key, len)
- char *key;
- int len;
-{
- return(17); /* So I'm cruel... */
-}
-
-main(argc, argv)
- int argc;
-{
- DB *db;
- DBT key, content;
- char keybuf[2049];
- char contentbuf[2049];
- char buf[256];
- int i;
- HASHINFO info;
-
- info.bsize = 1024;
- info.ffactor = 5;
- info.nelem = 1;
- info.cachesize = NULL;
-#ifdef HASH_ID_PROGRAM_SPECIFIED
- info.hash_id = HASH_ID_PROGRAM_SPECIFIED;
- info.hash_func = my_hash;
-#else
- info.hash = my_hash;
-#endif
- info.lorder = 0;
- if (!(db = dbopen("bigtest", O_RDWR | O_CREAT | O_BINARY, 0644, DB_HASH, &info))) {
- sprintf(buf, "dbopen: failed on file bigtest");
- perror(buf);
- exit(1);
- }
- srand(17);
- key.data = keybuf;
- content.data = contentbuf;
- memset(keybuf, '\0', sizeof(keybuf));
- memset(contentbuf, '\0', sizeof(contentbuf));
- for (i=1; i <= 500; i++) {
- key.size = 128 + (rand()&1023);
- content.size = 128 + (rand()&1023);
-/* printf("%d: Key size %d, data size %d\n", i, key.size,
- content.size); */
- sprintf(keybuf, "Key #%d", i);
- sprintf(contentbuf, "Contents #%d", i);
- if ((db->put)(db, &key, &content, R_NOOVERWRITE)) {
- sprintf(buf, "dbm_store #%d", i);
- perror(buf);
- }
- }
- if ((db->close)(db)) {
- perror("closing hash file");
- exit(1);
- }
- exit(0);
-}
-
-
-
diff --git a/src/util/db2/test/hash1.tests/makedb.sh b/src/util/db2/test/hash1.tests/makedb.sh
deleted file mode 100644
index 15901de193..0000000000
--- a/src/util/db2/test/hash1.tests/makedb.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/sh
-#
-# @(#)makedb.sh 8.1 (Berkeley) 6/4/93
-
-awk '{i++; print $0; print i;}' /usr/local/lib/dict/words > WORDS
-ls /bin /usr/bin /usr/ucb /etc | egrep '^(...|....|.....|......)$' | \
-sort | uniq | \
-awk '{
- printf "%s\n", $0
- for (i = 0; i < 1000; i++)
- printf "%s+", $0
- printf "\n"
-}' > LONG.DATA
diff --git a/src/util/db2/test/hash1.tests/tcreat3.c b/src/util/db2/test/hash1.tests/tcreat3.c
deleted file mode 100644
index f11487b320..0000000000
--- a/src/util/db2/test/hash1.tests/tcreat3.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Margo Seltzer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1991, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static char sccsid[] = "@(#)tcreat3.c 8.1 (Berkeley) 6/4/93";
-#endif /* not lint */
-
-#include <sys/types.h>
-#include <sys/file.h>
-#include <stdio.h>
-#include "db-int.h"
-
-#define INITIAL 25000
-#define MAXWORDS 25000 /* # of elements in search table */
-
-char wp1[8192];
-char wp2[8192];
-main(argc, argv)
-char **argv;
-{
- DBT item, key;
- DB *dbp;
- HASHINFO ctl;
- FILE *fp;
- int trash;
-
- int i = 0;
-
- argv++;
- ctl.hash = NULL;
- ctl.bsize = atoi(*argv++);
- ctl.ffactor = atoi(*argv++);
- ctl.nelem = atoi(*argv++);
- ctl.lorder = 0;
- if (!(dbp = dbopen( "hashtest",
- O_CREAT|O_TRUNC|O_RDWR|O_BINARY, 0600, DB_HASH, &ctl))){
- /* create table */
- fprintf(stderr, "cannot create: hash table (size %d)\n",
- INITIAL);
- exit(1);
- }
-
- key.data = wp1;
- item.data = wp2;
- while ( fgets(wp1, 8192, stdin) &&
- fgets(wp2, 8192, stdin) &&
- i++ < MAXWORDS) {
-/*
-* put info in structure, and structure in the item
-*/
- key.size = strlen(wp1);
- item.size = strlen(wp2);
-
-/*
- * enter key/data pair into the table
- */
- if ((dbp->put)(dbp, &key, &item, R_NOOVERWRITE) != NULL) {
- fprintf(stderr, "cannot enter: key %s\n",
- item.data);
- exit(1);
- }
- }
-
- (dbp->close)(dbp);
- exit(0);
-}
diff --git a/src/util/db2/test/hash1.tests/tdel.c b/src/util/db2/test/hash1.tests/tdel.c
deleted file mode 100644
index 826611486d..0000000000
--- a/src/util/db2/test/hash1.tests/tdel.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Margo Seltzer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1991, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static char sccsid[] = "@(#)tdel.c 8.1 (Berkeley) 6/4/93";
-#endif /* not lint */
-
-#include <sys/types.h>
-#include <sys/file.h>
-#include "db-int.h"
-#include <stdio.h>
-
-#define INITIAL 25000
-#define MAXWORDS 25000 /* # of elements in search table */
-
-/* Usage: thash pagesize fillfactor file */
-char wp1[8192];
-char wp2[8192];
-main(argc, argv)
-char **argv;
-{
- DBT item, key;
- DB *dbp;
- HASHINFO ctl;
- FILE *fp;
- int stat;
-
- int i = 0;
-
- argv++;
- ctl.nelem = INITIAL;
- ctl.hash = NULL;
- ctl.bsize = atoi(*argv++);
- ctl.ffactor = atoi(*argv++);
- ctl.cachesize = 1024 * 1024; /* 1 MEG */
- ctl.lorder = 0;
- argc -= 2;
- if (!(dbp = dbopen( NULL, O_CREAT|O_RDWR|O_BINARY, 0400, DB_HASH, &ctl))) {
- /* create table */
- fprintf(stderr, "cannot create: hash table size %d)\n",
- INITIAL);
- exit(1);
- }
-
- key.data = wp1;
- item.data = wp2;
- while ( fgets(wp1, 8192, stdin) &&
- fgets(wp2, 8192, stdin) &&
- i++ < MAXWORDS) {
-/*
-* put info in structure, and structure in the item
-*/
- key.size = strlen(wp1);
- item.size = strlen(wp2);
-
-/*
- * enter key/data pair into the table
- */
- if ((dbp->put)(dbp, &key, &item, R_NOOVERWRITE) != NULL) {
- fprintf(stderr, "cannot enter: key %s\n",
- item.data);
- exit(1);
- }
- }
-
- if ( --argc ) {
- fp = fopen ( argv[0], "r");
- i = 0;
- while ( fgets(wp1, 8192, fp) &&
- fgets(wp2, 8192, fp) &&
- i++ < MAXWORDS) {
- key.size = strlen(wp1);
- stat = (dbp->del)(dbp, &key, 0);
- if (stat) {
- fprintf ( stderr, "Error retrieving %s\n", key.data );
- exit(1);
- }
- }
- fclose(fp);
- }
- (dbp->close)(dbp);
- exit(0);
-}
diff --git a/src/util/db2/test/hash1.tests/testit b/src/util/db2/test/hash1.tests/testit
deleted file mode 100644
index c80dc4e69b..0000000000
--- a/src/util/db2/test/hash1.tests/testit
+++ /dev/null
@@ -1,154 +0,0 @@
-#!/bin/csh -f
-#
-# @(#)testit 8.1 (Berkeley) 6/4/93
-#
-
-echo ""
-echo "PAGE FILL "
-set name=WORDS
- set i = 256
- foreach j ( 11 14 21 )
- echo "thash4 $i $j"
- ./thash4 $i $j 25000 65536 $name < $name
- end
- set i = 512
- foreach j ( 21 28 43 )
- echo "thash4 $i $j"
- ./thash4 $i $j 25000 65536 $name < $name
- end
- set i = 1024
- foreach j ( 43 57 85 )
- echo "thash4 $i $j"
- ./thash4 $i $j 25000 65536 $name < $name
- end
- set i = 2048
- foreach j ( 85 114 171 )
- echo "thash4 $i $j"
- ./thash4 $i $j 25000 65536 $name < $name
- end
- set i = 4096
- foreach j ( 171 228 341 )
- echo "thash4 $i $j"
- ./thash4 $i $j 25000 65536 $name < $name
- end
- set i = 8192
- foreach j ( 341 455 683 )
- echo "thash4 $i $j"
- ./thash4 $i $j 25000 65536 $name < $name
- end
- echo "PAGE FILL "
- set i = 256
- foreach j ( 11 14 21 )
- echo "$i"_"$j"
- ./tcreat3 $i $j 25000 $name < $name
- ./tread2 65536 < $name
- ./tverify $name < $name
- ./tseq > /dev/null
- ./tdel $i $j $name < $name
- end
- set i = 512
- foreach j ( 21 28 43 )
- echo "$i"_"$j"
- ./tcreat3 $i $j 25000 $name < $name
- ./tread2 65536 < $name
- ./tverify $name < $name
- ./tseq > /dev/null
- ./tdel $i $j $name < $name
- end
- set i = 1024
- foreach j ( 43 57 85 )
- echo "$i"_"$j"
- ./tcreat3 $i $j 25000 $name < $name
- ./tread2 65536 < $name
- ./tverify $name < $name
- ./tseq > /dev/null
- ./tdel $i $j $name < $name
- end
- set i = 2048
- foreach j ( 85 114 171 )
- echo "$i"_"$j"
- ./tcreat3 $i $j 25000 $name < $name
- ./tread2 65536 < $name
- ./tverify $name < $name
- ./tseq > /dev/null
- ./tdel $i $j $name < $name
- end
- set i = 4096
- foreach j ( 171 228 341 )
- echo "$i"_"$j"
- ./tcreat3 $i $j 25000 $name < $name
- ./tread2 65536 < $name
- ./tverify $name < $name
- ./tseq > /dev/null
- ./tdel $i $j $name < $name
- end
- set i = 8192
- foreach j ( 341 455 683 )
- echo "$i"_"$j"
- ./tcreat3 $i $j 25000 $name < $name
- ./tread2 65536 < $name
- ./tverify $name < $name
- ./tseq > /dev/null
- ./tdel $i $j $name < $name
- end
-set name=LONG.DATA
- set i = 1024
- foreach j ( 1 2 4 )
- echo ./thash4 $i $j 600 65536 $name
- ./thash4 $i $j 600 65536 $name < $name
- end
-
- set i = 2048
- foreach j ( 1 2 4 )
- echo ./thash4 $i $j 600 65536 $name
- ./thash4 $i $j 600 65536 $name < $name
- end
- set i = 4096
- foreach j ( 1 2 4 )
- echo ./thash4 $i $j 600 65536 $name
- ./thash4 $i $j 600 65536 $name < $name
- end
- set i = 8192
- foreach j ( 2 4 8 )
- echo ./thash4 $i $j 600 65536 $name
- ./thash4 $i $j 600 65536 $name < $name
- end
- echo "PAGE FILL "
- set i = 1024
- foreach j ( 1 2 4 )
- echo "$i"_"$j"
- ./tcreat3 $i $j 600 $name < $name
- ./tread2 65536 < $name
- ./tverify $name < $name
- ./tseq > /dev/null
- ./tdel $i $j $name < $name
- end
- set i = 2048
- foreach j ( 1 2 4 )
- echo "$i"_"$j"
- ./tcreat3 $i $j 600 $name < $name
- ./tread2 65536 < $name
- ./tverify $name < $name
- ./tseq > /dev/null
- ./tdel $i $j $name < $name
- end
- set i = 4096
- foreach j ( 1 2 4 )
- echo "$i"_"$j"
- ./tcreat3 $i $j 600 $name < $name
- ./tread2 65536 < $name
- ./tverify $name < $name
- ./tseq > /dev/null
- ./tdel $i $j $name < $name
- end
- set i = 8192
- foreach j ( 2 4 8 )
- echo "$i"_"$j"
- ./tcreat3 $i $j 600 $name < $name
- ./tread2 65536 < $name
- ./tverify $name < $name
- ./tseq > /dev/null
- ./tdel $i $j $name < $name
- end
-
-./driver2
diff --git a/src/util/db2/test/hash1.tests/thash4.c b/src/util/db2/test/hash1.tests/thash4.c
deleted file mode 100644
index b15b617bc7..0000000000
--- a/src/util/db2/test/hash1.tests/thash4.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Margo Seltzer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1991, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static char sccsid[] = "@(#)thash4.c 8.1 (Berkeley) 6/4/93";
-#endif /* not lint */
-
-#include <sys/types.h>
-#include <sys/file.h>
-#include <stdio.h>
-#include <errno.h>
-#include "db-int.h"
-
-#define INITIAL 25000
-#define MAXWORDS 25000 /* # of elements in search table */
-
-/* Usage: thash pagesize fillfactor file */
-char wp1[8192];
-char wp2[8192];
-main(argc, argv)
-char **argv;
-{
- DBT item, key, res;
- DB *dbp;
- HASHINFO ctl;
- FILE *fp;
- int stat;
- time_t t;
-
- int i = 0;
-
- argv++;
- ctl.hash = NULL;
- ctl.bsize = atoi(*argv++);
- ctl.ffactor = atoi(*argv++);
- ctl.nelem = atoi(*argv++);
- ctl.cachesize = atoi(*argv++);
- ctl.lorder = 0;
- if (!(dbp = dbopen( NULL, O_CREAT|O_RDWR|O_BINARY, 0400, DB_HASH, &ctl))) {
- /* create table */
- fprintf(stderr, "cannot create: hash table size %d)\n",
- INITIAL);
- fprintf(stderr, "\terrno: %d\n", errno);
- exit(1);
- }
-
- key.data = wp1;
- item.data = wp2;
- while ( fgets(wp1, 8192, stdin) &&
- fgets(wp2, 8192, stdin) &&
- i++ < MAXWORDS) {
-/*
-* put info in structure, and structure in the item
-*/
- key.size = strlen(wp1);
- item.size = strlen(wp2);
-
-/*
- * enter key/data pair into the table
- */
- if ((dbp->put)(dbp, &key, &item, R_NOOVERWRITE) != NULL) {
- fprintf(stderr, "cannot enter: key %s\n",
- item.data);
- fprintf(stderr, "\terrno: %d\n", errno);
- exit(1);
- }
- }
-
- if ( --argc ) {
- fp = fopen ( argv[0], "r");
- i = 0;
- while ( fgets(wp1, 256, fp) &&
- fgets(wp2, 8192, fp) &&
- i++ < MAXWORDS) {
-
- key.size = strlen(wp1);
- stat = (dbp->get)(dbp, &key, &res, 0);
- if (stat < 0 ) {
- fprintf ( stderr, "Error retrieving %s\n", key.data );
- fprintf(stderr, "\terrno: %d\n", errno);
- exit(1);
- } else if ( stat > 0 ) {
- fprintf ( stderr, "%s not found\n", key.data );
- fprintf(stderr, "\terrno: %d\n", errno);
- exit(1);
- }
- }
- fclose(fp);
- }
- dbp->close(dbp);
- exit(0);
-}
diff --git a/src/util/db2/test/hash1.tests/tread2.c b/src/util/db2/test/hash1.tests/tread2.c
deleted file mode 100644
index 1e2cc4c503..0000000000
--- a/src/util/db2/test/hash1.tests/tread2.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Margo Seltzer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1991, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static char sccsid[] = "@(#)tread2.c 8.1 (Berkeley) 6/4/93";
-#endif /* not lint */
-
-#include <sys/types.h>
-#include <sys/file.h>
-#include <stdio.h>
-#include "db-int.h"
-
-#define INITIAL 25000
-#define MAXWORDS 25000 /* # of elements in search table */
-
-typedef struct { /* info to be stored */
- int num, siz;
-} info;
-
-char wp1[8192];
-char wp2[8192];
-main(argc, argv)
-char **argv;
-{
- DBT item, key, res;
- DB *dbp;
- HASHINFO ctl;
- int stat;
-
- int i = 0;
-
- ctl.nelem = INITIAL;
- ctl.hash = NULL;
- ctl.bsize = 64;
- ctl.ffactor = 1;
- ctl.cachesize = atoi(*argv++);
- ctl.lorder = 0;
- if (!(dbp = dbopen( "hashtest", O_RDONLY|O_BINARY, 0400, DB_HASH, &ctl))) {
- /* create table */
- fprintf(stderr, "cannot open: hash table\n" );
- exit(1);
- }
-
- key.data = wp1;
- item.data = wp2;
- while ( fgets(wp1, 8192, stdin) &&
- fgets(wp2, 8192, stdin) &&
- i++ < MAXWORDS) {
-/*
-* put info in structure, and structure in the item
-*/
- key.size = strlen(wp1);
- item.size = strlen(wp2);
-
- stat = (dbp->get)(dbp, &key, &res,0);
- if (stat < 0) {
- fprintf ( stderr, "Error retrieving %s\n", key.data );
- exit(1);
- } else if ( stat > 0 ) {
- fprintf ( stderr, "%s not found\n", key.data );
- exit(1);
- }
- }
- (dbp->close)(dbp);
- exit(0);
-}
diff --git a/src/util/db2/test/hash1.tests/tseq.c b/src/util/db2/test/hash1.tests/tseq.c
deleted file mode 100644
index d2d36862d1..0000000000
--- a/src/util/db2/test/hash1.tests/tseq.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Margo Seltzer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1991, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static char sccsid[] = "@(#)tseq.c 8.1 (Berkeley) 6/4/93";
-#endif /* not lint */
-
-#include <sys/types.h>
-#include <sys/file.h>
-#include <stdio.h>
-#include "db-int.h"
-
-#define INITIAL 25000
-#define MAXWORDS 25000 /* # of elements in search table */
-
-
-char wp[8192];
-char cp[8192];
-main(argc, argv)
-char **argv;
-{
- DBT item, key, res;
- DB *dbp;
- FILE *fp;
- int stat;
-
- if (!(dbp = dbopen( "hashtest", O_RDONLY|O_BINARY, 0400, DB_HASH, NULL))) {
- /* create table */
- fprintf(stderr, "cannot open: hash table\n" );
- exit(1);
- }
-
-/*
-* put info in structure, and structure in the item
-*/
- for ( stat = (dbp->seq) (dbp, &res, &item, 1 );
- stat == 0;
- stat = (dbp->seq) (dbp, &res, &item, 0 ) ) {
-
- memcpy ( wp, res.data, res.size );
- wp[res.size] = 0;
- memcpy ( cp, item.data, item.size );
- cp[item.size] = 0;
-
- printf ( "%s %s\n", wp, cp );
- }
- (dbp->close)(dbp);
- exit(0);
-}
diff --git a/src/util/db2/test/hash1.tests/tverify.c b/src/util/db2/test/hash1.tests/tverify.c
deleted file mode 100644
index 4747804f76..0000000000
--- a/src/util/db2/test/hash1.tests/tverify.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*-
- * Copyright (c) 1991, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Margo Seltzer.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1991, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static char sccsid[] = "@(#)tverify.c 8.1 (Berkeley) 6/4/93";
-#endif /* not lint */
-
-#include <sys/types.h>
-#include <sys/file.h>
-#include <stdio.h>
-#include "db-int.h"
-
-#define INITIAL 25000
-#define MAXWORDS 25000 /* # of elements in search table */
-
-typedef struct { /* info to be stored */
- int num, siz;
-} info;
-
-char wp1[8192];
-char wp2[8192];
-main(argc, argv)
-char **argv;
-{
- DBT key, res;
- DB *dbp;
- HASHINFO ctl;
- int trash;
- int stat;
-
- int i = 0;
-
- ctl.nelem = INITIAL;
- ctl.hash = NULL;
- ctl.bsize = 64;
- ctl.ffactor = 1;
- ctl.cachesize = 1024 * 1024; /* 1 MEG */
- ctl.lorder = 0;
- if (!(dbp = dbopen( "hashtest", O_RDONLY|O_BINARY, 0400, DB_HASH, &ctl))) {
- /* create table */
- fprintf(stderr, "cannot open: hash table\n" );
- exit(1);
- }
-
- key.data = wp1;
- while ( fgets(wp1, 8192, stdin) &&
- fgets(wp2, 8192, stdin) &&
- i++ < MAXWORDS) {
-/*
-* put info in structure, and structure in the item
-*/
- key.size = strlen(wp1);
-
- stat = (dbp->get)(dbp, &key, &res,0);
- if (stat < 0) {
- fprintf ( stderr, "Error retrieving %s\n", key.data );
- exit(1);
- } else if ( stat > 0 ) {
- fprintf ( stderr, "%s not found\n", key.data );
- exit(1);
- }
- if ( memcmp ( res.data, wp2, res.size ) ) {
- fprintf ( stderr, "data for %s is incorrect. Data was %s. Should have been %s\n", key.data, res.data, wp2 );
- }
- }
- (dbp->close)(dbp);
- exit(0);
-}
diff --git a/src/util/db2/test/hash2.tests/README b/src/util/db2/test/hash2.tests/README
deleted file mode 100644
index f29ccf7e1b..0000000000
--- a/src/util/db2/test/hash2.tests/README
+++ /dev/null
@@ -1,72 +0,0 @@
-# @(#)README 8.1 (Berkeley) 6/4/93
-
-This package implements a superset of the hsearch and dbm/ndbm libraries.
-
-Test Programs:
- All test programs which need key/data pairs expect them entered
- with key and data on separate lines
-
- tcreat3.c
- Takes
- bucketsize (bsize),
- fill factor (ffactor), and
- initial number of elements (nelem).
- Creates a hash table named hashtest containing the
- keys/data pairs entered from standard in.
- thash4.c
- Takes
- bucketsize (bsize),
- fill factor (ffactor),
- initial number of elements (nelem)
- bytes of cache (ncached), and
- file from which to read data (fname)
- Creates a table from the key/data pairs on standard in and
- then does a read of each key/data in fname
- tdel.c
- Takes
- bucketsize (bsize), and
- fill factor (ffactor).
- file from which to read data (fname)
- Reads each key/data pair from fname and deletes the
- key from the hash table hashtest
- tseq.c
- Reads the key/data pairs in the file hashtest and writes them
- to standard out.
- tread2.c
- Takes
- butes of cache (ncached).
- Reads key/data pairs from standard in and looks them up
- in the file hashtest.
- tverify.c
- Reads key/data pairs from standard in, looks them up
- in the file hashtest, and verifies that the data is
- correct.
-
-NOTES:
-
-The file search.h is provided for using the hsearch compatible interface
-on BSD systems. On System V derived systems, search.h should appear in
-/usr/include.
-
-The man page ../man/db.3 explains the interface to the hashing system.
-The file hash.ps is a postscript copy of a paper explaining
-the history, implementation, and performance of the hash package.
-
-"bugs" or idiosyncracies
-
-If you have a lot of overflows, it is possible to run out of overflow
-pages. Currently, this will cause a message to be printed on stderr.
-Eventually, this will be indicated by a return error code.
-
-If you are using the ndbm interface and exit without flushing or closing the
-file, you may lose updates since the package buffers all writes. Also,
-the db interface only creates a single database file. To avoid overwriting
-the user's original file, the suffix ".db" is appended to the file name
-passed to dbm_open. Additionally, if your code "knows" about the historic
-.dir and .pag files, it will break.
-
-There is a fundamental difference between this package and the old hsearch.
-Hsearch requires the user to maintain the keys and data in the application's
-allocated memory while hash takes care of all storage management. The down
-side is that the byte strings passed in the ENTRY structure must be null
-terminated (both the keys and the data).
diff --git a/src/util/db2/test/hash2.tests/bigtest.c b/src/util/db2/test/hash2.tests/bigtest.c
deleted file mode 100644
index 81c559ad2a..0000000000
--- a/src/util/db2/test/hash2.tests/bigtest.c
+++ /dev/null
@@ -1,76 +0,0 @@
-#include "db-int.h"
-#include <stdio.h>
-#include <fcntl.h>
-#include <assert.h>
-#include <stdlib.h>
-
-int
-main(void)
-{
- HASHINFO info;
- DB *db;
- DBT key, value, returned;
- int *data;
- int n, i;
-
- info.bsize = 512;
- info.cachesize = 500;
- info.lorder = 0;
- info.ffactor = 4;
- info.nelem = 0;
- info.hash = NULL;
-
- db = dbopen("big2.db", O_RDWR|O_CREAT|O_TRUNC|O_BINARY, 0664, DB_HASH, &info);
- data = malloc(800 * sizeof(int));
- for (n = 0; n < 800; n++)
- data[n] = 0xDEADBEEF;
- key.size = sizeof(int);
- key.data = &n;
- value.size = 800 * sizeof(int);
- value.data = (void *)data;
-
- for (n = 0; n < 200000; n++) {
- returned.data = NULL;
- if (n == 4627)
- printf("");
- if (n % 50 == 0)
- printf("put n = %d\n", n);
- if (db->put(db, &key, &value, 0) != 0)
- printf("put error, n = %d\n", n);
- if (db->get(db, &key, &returned, 0) != 0)
- printf("Immediate get error, n = %d\n", n);
- assert (returned.size == 3200);
- for (i = 0; i < 800; i++)
- if (((int *)returned.data)[i] != 0xDEADBEEF)
- printf("ERRORRRRRR!!!\n");
-
- }
-
- for (n = 0; n < 200000; n++) {
- if (n % 50 == 0)
- printf("seq n = %d\n", n);
- if ((db->seq(db, &key, &returned, 0)) != 0)
- printf("Seq error, n = %d\n", n);
-
- assert(returned.size == 3200);
-
- for (i = 0; i < 800; i++)
- if (((int *)returned.data)[i] != 0xDEADBEEF)
- printf("ERRORRRRRR!!! seq %d\n", n);
- }
-
- for (n = 0; n < 2000; n++) {
- if (n % 50 == 0)
- printf("get n = %d\n", n);
- if (db->get(db, &key, &returned, 0) != 0)
- printf("Late get error, n = %d\n", n);
- assert(returned.size == 1200);
- for (i = 0; i < 300; i++)
- if (((int *)returned.data)[i] != 0xDEADBEEF)
- printf("ERRORRRRRR!!!, get %d\n", n);
- }
- db->close(db);
- free(value.data);
- return(0);
-}
-
diff --git a/src/util/db2/test/hash2.tests/passtest.c b/src/util/db2/test/hash2.tests/passtest.c
deleted file mode 100644
index adb72c004b..0000000000
--- a/src/util/db2/test/hash2.tests/passtest.c
+++ /dev/null
@@ -1,184 +0,0 @@
-#include "db-int.h"
-#include <fcntl.h>
-#include <stdio.h>
-#include <string.h>
-
-extern int hash_expansions;
-
-int
-main(void)
-{
- FILE *keys, *vals;
- DB *db;
- DBT key, val;
- char *key_line, *val_line, *get_key, *get_val, *old, *key2;
- HASHINFO passwd;
- int n = 0, i = 0, expected;
-
- key_line = (char *)malloc(100);
- val_line = (char *)malloc(300);
- old = (char *)malloc(300);
-
- keys = fopen("yp.keys", "rt");
- vals = fopen("yp.total", "rt");
-
- passwd.bsize = 1024;
- passwd.cachesize = 1024 * 1024;
- passwd.ffactor = 10;
- passwd.hash = NULL;
- passwd.nelem = 0;
- passwd.lorder = 4321;
-
-
- db = dbopen("/usr/tmp/passwd.db", O_RDWR|O_CREAT|O_TRUNC|O_BINARY, 0664, DB_HASH,
- &passwd);
- if (!db) {
- fprintf(stderr, "create_db: couldn't create database file\n");
- exit(1);
- }
-
- while ((key_line = fgets(key_line, 100, keys)) != NULL) {
- if (n % 1000 == 0)
- fprintf(stderr, "Putting #%d.\n", n);
- n++;
- fgets(val_line, 300, vals);
- key.size = strlen(key_line);
- key.data = (void *)key_line;
- val.size = strlen(val_line);
- val.data = (void *)val_line;
- if (db->put(db, &key, &val, 0) != 0)
- fprintf(stderr, "Put error, n = %d\n", n);
- if (db->get(db, &key, &val, 0) != 0)
- fprintf(stderr, "Immediate get error, n = %d\n", n);
- }
- fprintf(stderr, "Done with put!\n");
- free(key_line);
- free(val_line);
- fclose(keys);
- fclose(vals);
- db->close(db);
-
-
-
-
- keys = fopen("yp.keys", "rt");
- vals = fopen("yp.total", "rt");
- get_key = (char *)malloc(100);
- get_val = (char *)malloc(300);
-
- db = dbopen("/usr/tmp/passwd.db", O_RDWR|O_BINARY, 0664, DB_HASH, &passwd);
- if (!db)
- fprintf(stderr, "Could not open db!\n");
- n = 0;
- while ((get_key = fgets(get_key, 100, keys)) != NULL) {
- n++;
- if (n % 1000 == 0)
- fprintf(stderr, "Getting #%d.\n", n);
- key.size = strlen(get_key);
- key.data = (void *)get_key;
- if (db->get(db, &key, &val, 0) != 0)
- fprintf(stderr, "Retrieval error on %s\n", get_key);
- fgets(get_val, 300, vals);
- if (memcmp(val.data, (void *)get_val, val.size)) {
- fprintf(stderr, "Unmatched get on %s.\n", get_key);
- fprintf(stderr, "Input = %s\nOutput = %s\n", get_val,
- (char *)val.data);
- }
- }
- expected = n;
- fclose(vals);
- fclose(keys);
- free(get_key);
- free(get_val);
- db->close(db);
-
-
-
-
- get_key = (char *)malloc(100);
- get_val = (char *)malloc(300);
-
- db = dbopen("/usr/tmp/passwd.db", O_RDWR, 0664, DB_HASH, &passwd);
- if (!db)
- fprintf(stderr, "Could not open db!\n");
- n = 0;
- for (;;) {
- n++;
- if (n % 1000 == 0)
- fprintf(stderr, "Sequence getting #%d.\n", n);
- if (db->seq(db, &key, &val, 0) != 0) {
- fprintf(stderr,
- "Exiting sequence retrieve; n = %d, expected = %d\n",
- n - 1 , expected);
- break;
- }
- }
- free(get_key);
- free(get_val);
- db->close(db);
-
- get_key = (char *)malloc(100);
- key2 = (char *)malloc(100);
-
- keys = fopen("yp.keys", "rt");
- vals = fopen("yp.total", "rt");
-
- db = dbopen("/usr/tmp/passwd.db", O_RDWR|O_BINARY, 0664, DB_HASH, &passwd);
- n = 0;
- while ((get_key = fgets(get_key, 100, keys)) != NULL) {
- if (n % 1000 == 0)
- fprintf(stderr, "Deleting #%d.\n", n);
- n+=2;
- key2 = fgets(get_key, 100, keys);
- if (!key2)
- break;
- key.data = (void *)key2;
- key.size = strlen(key2);
- if (db->del(db, &key, 0) != 0)
- fprintf(stderr, "Delete error on %d", n);
- }
-
- db->close(db);
- free(get_key);
- free(key2);
- fclose(keys);
- fclose(vals);
-
- get_key = (char *)malloc(100);
- key2 = (char *)malloc(100);
- get_val = (char *)malloc(300);
-
- keys = fopen("yp.keys", "rt");
- vals = fopen("yp.total", "rt");
-
- db = dbopen("/usr/tmp/passwd.db", O_RDWR|O_BINARY, 0664, DB_HASH, &passwd);
- n = 0;
- while ((get_key = fgets(get_key, 100, keys)) != NULL) {
- n += 2;
- if (n % 1000 == 0)
- fprintf(stderr, "Re-retrieving #%d.\n", n);
- key2 = fgets(key2, 100, keys);
- if (!key2)
- break;
- key.data = (void *)get_key;
- key.size = strlen(get_key);
- if (db->get(db, &key, &val, 0) != 0)
- fprintf(stderr, "Retrieval after delete error on %d\n", n);
- fgets(get_val, 300, vals);
- if (memcmp(val.data, (void *)get_val, val.size)) {
- fprintf(stderr, "Unmatched get after delete on %s.\n", get_key);
- fprintf(stderr, "Input = %s\nOutput = %s\n", get_val,
- (char *)val.data);
- }
- fgets(get_val, 300, vals);
- }
-
- db->close(db);
- free(get_key);
- free(key2);
- free(get_val);
- fclose(keys);
- fclose(vals);
-
- exit(0);
-}
diff --git a/src/util/db2/test/hash2.tests/passwd/genpass.c b/src/util/db2/test/hash2.tests/passwd/genpass.c
deleted file mode 100644
index da37676878..0000000000
--- a/src/util/db2/test/hash2.tests/passwd/genpass.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-void
-main(int argc, char **argv)
-{
- int i,j,n;
- char *pass[8], r;
-
- n = atoi(argv[1]);
-
- srandom(101173);
- for (i = 0; i < n; i++) {
- for (j = 0; j < 8; j++) {
- r = random() % 122;
- while (r < 48)
- r += random() % (122 - r);
- printf("%c", r);
- }
- printf("\n");
- }
-}
-
diff --git a/src/util/db2/test/run.test b/src/util/db2/test/run.test
deleted file mode 100644
index 48c3a63d0e..0000000000
--- a/src/util/db2/test/run.test
+++ /dev/null
@@ -1,746 +0,0 @@
-#!/bin/sh -
-#
-# @(#)run.test 8.13 (Berkeley) 11/2/95
-#
-
-# db regression tests
-main()
-{
-
- PROG=./dbtest
- TMP1=${TMPDIR-.}/t1
- TMP2=${TMPDIR-.}/t2
- TMP3=${TMPDIR-.}/t3
-
- if [ \! -z "$WORDLIST" -a -f "$WORDLIST" ]; then
- DICT=$WORDLIST
- elif [ -f /usr/local/lib/dict/words ]; then
- DICT=/usr/local/lib/dict/words
- elif [ -f /usr/share/dict/words ]; then
- DICT=/usr/share/dict/words
- elif [ -f /usr/dict/words ]; then
- DICT=/usr/dict/words
- elif [ -f /usr/share/lib/dict/words ]; then
- DICT=/usr/share/lib/dict/words
- elif [ -f $srcdir/../test/dictionary ]; then
- DICT=`cd $srcdir/../test && pwd`/dictionary
- else
- echo 'run.test: no dictionary'
- exit 1
- fi
-
- dictsize=`wc -l < $DICT`
-
- bindir=/bin/.
-
- if [ $# -eq 0 ]; then
- for t in 1 2 3 4 5 6 7 8 9 10 11 12 13 20; do
- test$t
- done
- else
- while [ $# -gt 0 ]
- do case "$1" in
- test*)
- $1;;
- [0-9]*)
- test$1;;
- btree)
- for t in 1 2 3 7 8 9 10 12 13; do
- test$t
- done;;
- hash)
- for t in 1 2 3 8 13 20; do
- test$t
- done;;
- recno)
- for t in 1 2 3 4 5 6 7 10 11; do
- test$t
- done;;
- *)
- echo "run.test: unknown test $1"
- echo "usage: run.test test# | type"
- exit 1
- esac
- shift
- done
- fi
- rm -f $TMP1 $TMP2 $TMP3
- exit 0
-}
-
-getnwords() {
- # Delete blank lines because the db code appears not to
- # like empty keys. On Debian Linux, $DICT appears to contain
- # some non-ASCII characters, and "rev" chokes on them.
- sed -e '/^$/d' < $DICT | cat -v | sed -e ${1}q
-}
-
-# Take the first hundred entries in the dictionary, and make them
-# be key/data pairs.
-test1()
-{
- echo "Test 1: btree, hash: small key, small data pairs"
- getnwords 200 > $TMP1
- for type in btree hash; do
- rm -f $TMP2 $TMP3
- for i in `cat $TMP1`; do
- echo p
- echo k$i
- echo d$i
- echo g
- echo k$i
- done > $TMP2
- $PROG -o $TMP3 $type $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test1: type $type: failed"
- exit 1
- fi
- done
- echo "Test 1: recno: small key, small data pairs"
- rm -f $TMP2 $TMP3
- awk '{
- ++i;
- printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
- }' < $TMP1 > $TMP2
- $PROG -o $TMP3 recno $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test1: type recno: failed"
- exit 1
- fi
-}
-
-# Take the first 200 entries in the dictionary, and give them
-# each a medium size data entry.
-test2()
-{
- echo "Test 2: btree, hash: small key, medium data pairs"
- mdata=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
- echo $mdata |
- awk '{ for (i = 1; i < 201; ++i) print $0 }' > $TMP1
- for type in hash btree; do
- rm -f $TMP2 $TMP3
- for i in `getnwords 200`; do
- echo p
- echo k$i
- echo d$mdata
- echo g
- echo k$i
- done > $TMP2
- $PROG -o $TMP3 $type $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test2: type $type: failed"
- exit 1
- fi
- done
- echo "Test 2: recno: small key, medium data pairs"
- rm -f $TMP2 $TMP3
- echo $mdata |
- awk '{ for (i = 1; i < 201; ++i)
- printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
- }' > $TMP2
- $PROG -o $TMP3 recno $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test2: type recno: failed"
- exit 1
- fi
-}
-
-# Insert the programs in $bindir with their paths as their keys.
-test3()
-{
- echo "Test 3: hash: small key, big data pairs"
- rm -f $TMP1
- (find $bindir -type f -exec test -r {} \; -print | xargs cat) > $TMP1
- for type in hash; do
- rm -f $TMP2 $TMP3
- for i in `find $bindir -type f -exec test -r {} \; -print`; do
- echo p
- echo k$i
- echo D$i
- echo g
- echo k$i
- done > $TMP2
- $PROG -o $TMP3 $type $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test3: $type: failed"
- exit 1
- fi
- done
- echo "Test 3: btree: small key, big data pairs"
- for psize in 512 16384 65536; do
- echo " page size $psize"
- for type in btree; do
- rm -f $TMP2 $TMP3
- for i in `find $bindir -type f -exec test -r {} \; -print`; do
- echo p
- echo k$i
- echo D$i
- echo g
- echo k$i
- done > $TMP2
- $PROG -i psize=$psize -o $TMP3 $type $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test3: $type: page size $psize: failed"
- exit 1
- fi
- done
- done
- echo "Test 3: recno: big data pairs"
- rm -f $TMP2 $TMP3
- find $bindir -type f -exec test -r {} \; -print |
- awk '{
- ++i;
- printf("p\nk%d\nD%s\ng\nk%d\n", i, $0, i);
- }' > $TMP2
- for psize in 512 16384 65536; do
- echo " page size $psize"
- $PROG -i psize=$psize -o $TMP3 recno $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test3: recno: page size $psize: failed"
- exit 1
- fi
- done
-}
-
-# Do random recno entries.
-test4()
-{
- echo "Test 4: recno: random entries"
- echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
- awk '{
- for (i = 37; i <= 37 + 88 * 17; i += 17) {
- if (i % 41)
- s = substr($0, 1, i % 41);
- else
- s = substr($0, 1);
- printf("input key %d: %s\n", i, s);
- }
- for (i = 1; i <= 15; ++i) {
- if (i % 41)
- s = substr($0, 1, i % 41);
- else
- s = substr($0, 1);
- printf("input key %d: %s\n", i, s);
- }
- for (i = 19234; i <= 19234 + 61 * 27; i += 27) {
- if (i % 41)
- s = substr($0, 1, i % 41);
- else
- s = substr($0, 1);
- printf("input key %d: %s\n", i, s);
- }
- exit
- }' > $TMP1
- rm -f $TMP2 $TMP3
- cat $TMP1 |
- awk 'BEGIN {
- i = 37;
- incr = 17;
- }
- {
- printf("p\nk%d\nd%s\n", i, $0);
- if (i == 19234 + 61 * 27)
- exit;
- if (i == 37 + 88 * 17) {
- i = 1;
- incr = 1;
- } else if (i == 15) {
- i = 19234;
- incr = 27;
- } else
- i += incr;
- }
- END {
- for (i = 37; i <= 37 + 88 * 17; i += 17)
- printf("g\nk%d\n", i);
- for (i = 1; i <= 15; ++i)
- printf("g\nk%d\n", i);
- for (i = 19234; i <= 19234 + 61 * 27; i += 27)
- printf("g\nk%d\n", i);
- }' > $TMP2
- $PROG -o $TMP3 recno $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test4: type recno: failed"
- exit 1
- fi
-}
-
-# Do reverse order recno entries.
-test5()
-{
- echo "Test 5: recno: reverse order entries"
- echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
- awk ' {
- for (i = 1500; i; --i) {
- if (i % 34)
- s = substr($0, 1, i % 34);
- else
- s = substr($0, 1);
- printf("input key %d: %s\n", i, s);
- }
- exit;
- }' > $TMP1
- rm -f $TMP2 $TMP3
- cat $TMP1 |
- awk 'BEGIN {
- i = 1500;
- }
- {
- printf("p\nk%d\nd%s\n", i, $0);
- --i;
- }
- END {
- for (i = 1500; i; --i)
- printf("g\nk%d\n", i);
- }' > $TMP2
- $PROG -o $TMP3 recno $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test5: type recno: failed"
- exit 1
- fi
-}
-
-# Do alternating order recno entries.
-test6()
-{
- echo "Test 6: recno: alternating order entries"
- echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
- awk ' {
- for (i = 1; i < 1200; i += 2) {
- if (i % 34)
- s = substr($0, 1, i % 34);
- else
- s = substr($0, 1);
- printf("input key %d: %s\n", i, s);
- }
- for (i = 2; i < 1200; i += 2) {
- if (i % 34)
- s = substr($0, 1, i % 34);
- else
- s = substr($0, 1);
- printf("input key %d: %s\n", i, s);
- }
- exit;
- }' > $TMP1
- rm -f $TMP2 $TMP3
- cat $TMP1 |
- awk 'BEGIN {
- i = 1;
- even = 0;
- }
- {
- printf("p\nk%d\nd%s\n", i, $0);
- i += 2;
- if (i >= 1200) {
- if (even == 1)
- exit;
- even = 1;
- i = 2;
- }
- }
- END {
- for (i = 1; i < 1200; ++i)
- printf("g\nk%d\n", i);
- }' > $TMP2
- $PROG -o $TMP3 recno $TMP2
- sort -o $TMP1 $TMP1
- sort -o $TMP3 $TMP3
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test6: type recno: failed"
- exit 1
- fi
-}
-
-# Delete cursor record
-test7()
-{
- echo "Test 7: btree, recno: delete cursor record"
- echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
- awk '{
- for (i = 1; i <= 120; ++i)
- printf("%05d: input key %d: %s\n", i, i, $0);
- printf("%05d: input key %d: %s\n", 120, 120, $0);
- printf("seq failed, no such key\n");
- printf("%05d: input key %d: %s\n", 1, 1, $0);
- printf("%05d: input key %d: %s\n", 2, 2, $0);
- exit;
- }' > $TMP1
- rm -f $TMP2 $TMP3
-
- for type in btree recno; do
- cat $TMP1 |
- awk '{
- if (i == 120)
- exit;
- printf("p\nk%d\nd%s\n", ++i, $0);
- }
- END {
- printf("fR_NEXT\n");
- for (i = 1; i <= 120; ++i)
- printf("s\n");
- printf("fR_CURSOR\ns\nk120\n");
- printf("r\n");
- printf("fR_NEXT\ns\n");
- printf("fR_CURSOR\ns\nk1\n");
- printf("r\n");
- printf("fR_FIRST\ns\n");
- }' > $TMP2
- $PROG -o $TMP3 recno $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test7: type $type: failed"
- exit 1
- fi
- done
-}
-
-# Make sure that overflow pages are reused.
-test8()
-{
- echo "Test 8: btree: repeated small key, big data pairs"
- rm -f $TMP1
- echo "" |
- awk 'BEGIN {
- for (i = 1; i <= 10; ++i) {
- printf("p\nkkey1\nD/bin/sh\n");
- printf("p\nkkey2\nD/bin/csh\n");
- if (i % 8 == 0) {
- printf("c\nkkey2\nD/bin/csh\n");
- printf("c\nkkey1\nD/bin/sh\n");
- printf("e\t%d of 10 (comparison)\n", i);
- } else
- printf("e\t%d of 10 \n", i);
- printf("r\nkkey1\nr\nkkey2\n");
- }
- }' > $TMP1
- if $PROG btree $TMP1 ; then
- true
- else
- echo "test8: btree tests failed"
- exit 1
- fi
-# $PROG hash $TMP1
- # No explicit test for success.
-}
-
-# Test btree duplicate keys
-test9()
-{
- echo "Test 9: btree: duplicate keys"
- echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
- awk '{
- for (i = 1; i <= 543; ++i)
- printf("%05d: input key %d: %s\n", i, i, $0);
- exit;
- }' > $TMP1
- rm -f $TMP2 $TMP3
-
- for type in btree; do
- cat $TMP1 |
- awk '{
- if (i++ % 2)
- printf("p\nkduplicatekey\nd%s\n", $0);
- else
- printf("p\nkunique%dkey\nd%s\n", i, $0);
- }
- END {
- printf("o\n");
- }' > $TMP2
- $PROG -iflags=1 -o $TMP3 $type $TMP2
- sort -o $TMP3 $TMP3
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test9: type $type: failed"
- exit 1
- fi
- done
-}
-
-# Test use of cursor flags without initialization
-test10()
-{
- echo "Test 10: btree, recno: test cursor flag use"
- echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
- awk '{
- for (i = 1; i <= 20; ++i)
- printf("%05d: input key %d: %s\n", i, i, $0);
- exit;
- }' > $TMP1
- rm -f $TMP2 $TMP3
-
- # Test that R_CURSOR doesn't succeed before cursor initialized
- for type in btree recno; do
- cat $TMP1 |
- awk '{
- if (i == 10)
- exit;
- printf("p\nk%d\nd%s\n", ++i, $0);
- }
- END {
- printf("fR_CURSOR\nr\n");
- printf("eR_CURSOR SHOULD HAVE FAILED\n");
- }' > $TMP2
- $PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
- if [ -s $TMP3 ] ; then
- echo "Test 10: delete: R_CURSOR SHOULD HAVE FAILED"
- exit 1
- fi
- done
- for type in btree recno; do
- cat $TMP1 |
- awk '{
- if (i == 10)
- exit;
- printf("p\nk%d\nd%s\n", ++i, $0);
- }
- END {
- printf("fR_CURSOR\np\nk1\ndsome data\n");
- printf("eR_CURSOR SHOULD HAVE FAILED\n");
- }' > $TMP2
- $PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
- if [ -s $TMP3 ] ; then
- echo "Test 10: put: R_CURSOR SHOULD HAVE FAILED"
- exit 1
- fi
- done
-}
-
-# Test insert in reverse order.
-test11()
-{
- echo "Test 11: recno: reverse order insert"
- echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
- awk '{
- for (i = 1; i <= 779; ++i)
- printf("%05d: input key %d: %s\n", i, i, $0);
- exit;
- }' > $TMP1
- rm -f $TMP2 $TMP3
-
- for type in recno; do
- cat $TMP1 |
- awk '{
- if (i == 0) {
- i = 1;
- printf("p\nk1\nd%s\n", $0);
- printf("%s\n", "fR_IBEFORE");
- } else
- printf("p\nk1\nd%s\n", $0);
- }
- END {
- printf("or\n");
- }' > $TMP2
- $PROG -o $TMP3 $type $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test11: type $type: failed"
- exit 1
- fi
- done
-}
-
-# Take the first 20000 entries in the dictionary, reverse them, and give
-# them each a small size data entry. Use a small page size to make sure
-# the btree split code gets hammered.
-test12()
-{
- if ( rev < /dev/null ) > /dev/null 2>&1 ; then
- :
- else
- echo "Test 12: skipped, rev not found"
- return
- fi
- if test $dictsize -lt 20001 ; then
- echo "Test 12: skipped, dictionary too small"
- return
- else
- :
- fi
- echo "Test 12: btree: lots of keys, small page size"
- mdata=abcdefghijklmnopqrstuvwxy
- echo $mdata |
- awk '{ for (i = 1; i < 20001; ++i) print $0 }' > $TMP1
- for type in btree; do
- rm -f $TMP2 $TMP3
- for i in `getnwords 20000 | rev`; do
- echo p
- echo k$i
- echo d$mdata
- echo g
- echo k$i
- done > $TMP2
- $PROG -i psize=512 -o $TMP3 $type $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test12: type $type: failed"
- exit 1
- fi
- done
-}
-
-# Test different byte orders.
-test13()
-{
- echo "Test 13: btree, hash: differing byte orders"
- getnwords 50 > $TMP1
- for order in 1234 4321; do
- for type in btree hash; do
- rm -f byte.file $TMP2 $TMP3
- for i in `cat $TMP1`; do
- echo p
- echo k$i
- echo d$i
- echo g
- echo k$i
- done > $TMP2
- $PROG -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test13: $type/$order put failed"
- exit 1
- fi
- for i in `cat $TMP1`; do
- echo g
- echo k$i
- done > $TMP2
- $PROG -s \
- -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test13: $type/$order get failed"
- exit 1
- fi
- done
- done
- rm -f byte.file
-}
-
-# Try a variety of bucketsizes and fill factors for hashing
-test20()
-{
- if test $dictsize -lt 10001 ; then
- echo "Test 20: skipped, dictionary too small"
- return
- else
- :
- fi
- echo\
- "Test 20: hash: bucketsize, fill factor; nelem 25000 cachesize 65536"
- echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
- awk '{
- for (i = 1; i <= 10000; ++i) {
- if (i % 34)
- s = substr($0, 1, i % 34);
- else
- s = substr($0, 1);
- printf("%s\n", s);
- }
- exit;
- }' > $TMP1
- getnwords 10000 |
- awk 'BEGIN {
- ds="abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg"
- }
- {
- if (++i % 34)
- s = substr(ds, 1, i % 34);
- else
- s = substr(ds, 1);
- printf("p\nk%s\nd%s\n", $0, s);
- }' > $TMP2
- getnwords 10000 |
- awk '{
- ++i;
- printf("g\nk%s\n", $0);
- }' >> $TMP2
- bsize=256
- for ffactor in 11 14 21; do
- echo " bucketsize $bsize, fill factor $ffactor"
- $PROG -o$TMP3 \
- -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
- hash $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test20: type hash:\
-bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
- exit 1
- fi
- done
- bsize=512
- for ffactor in 21 28 43; do
- echo " bucketsize $bsize, fill factor $ffactor"
- $PROG -o$TMP3 \
- -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
- hash $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test20: type hash:\
-bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
- exit 1
- fi
- done
- bsize=1024
- for ffactor in 43 57 85; do
- echo " bucketsize $bsize, fill factor $ffactor"
- $PROG -o$TMP3 \
- -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
- hash $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test20: type hash:\
-bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
- exit 1
- fi
- done
- bsize=2048
- for ffactor in 85 114 171; do
- echo " bucketsize $bsize, fill factor $ffactor"
- $PROG -o$TMP3 \
- -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
- hash $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test20: type hash:\
-bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
- exit 1
- fi
- done
- bsize=4096
- for ffactor in 171 228 341; do
- echo " bucketsize $bsize, fill factor $ffactor"
- $PROG -o$TMP3 \
- -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
- hash $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test20: type hash:\
-bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
- exit 1
- fi
- done
- bsize=8192
- for ffactor in 341 455 683; do
- echo " bucketsize $bsize, fill factor $ffactor"
- $PROG -o$TMP3 \
- -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
- hash $TMP2
- if (cmp -s $TMP1 $TMP3) ; then :
- else
- echo "test20: type hash:\
-bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
- exit 1
- fi
- done
-}
-
-main $*