* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
* This code is derived from software contributed to Berkeley by
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 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
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid
[] = "@(#)bt_debug.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
* BT_DUMP -- Dump the tree
(void)fprintf(stderr
, "%s: pgsz %d",
ISSET(t
, B_INMEM
) ? "memory" : "disk", t
->bt_psize
);
(void)fprintf(stderr
, " keys %lu", t
->bt_nrecs
);
(void)fprintf(stderr, "%s%s", sep, name); \
X(B_METADIRTY
,"METADIRTY");
(void)fprintf(stderr
, ")\n");
for (i
= P_ROOT
; (h
= mpool_get(t
->bt_mp
, i
, 0)) != NULL
; ++i
) {
(void)mpool_put(t
->bt_mp
, h
, 0);
* BT_DMPAGE -- Dump the meta page
(void)fprintf(stderr
, "magic %lx\n", m
->m_magic
);
(void)fprintf(stderr
, "version %lu\n", m
->m_version
);
(void)fprintf(stderr
, "psize %lu\n", m
->m_psize
);
(void)fprintf(stderr
, "free %lu\n", m
->m_free
);
(void)fprintf(stderr
, "nrecs %lu\n", m
->m_nrecs
);
(void)fprintf(stderr
, "flags %lu", m
->m_flags
);
if (m->m_flags & flag) { \
(void)fprintf(stderr, "%s%s", sep, name); \
(void)fprintf(stderr
, ")");
* BT_DNPAGE -- Dump the page
* n: page number to dump.
if ((h
= mpool_get(t
->bt_mp
, pgno
, 0)) != NULL
) {
(void)mpool_put(t
->bt_mp
, h
, 0);
* BT_DPAGE -- Dump the page
(void)fprintf(stderr
, " page %d: (", h
->pgno
);
(void)fprintf(stderr, "%s%s", sep, name); \
X(P_BINTERNAL
, "BINTERNAL") /* types */
X(P_RINTERNAL
, "RINTERNAL") /* types */
X(P_OVERFLOW
, "OVERFLOW")
X(P_PRESERVE
, "PRESERVE");
(void)fprintf(stderr
, ")\n");
(void)fprintf(stderr
, "\tprev %2d next %2d", h
->prevpg
, h
->nextpg
);
if (h
->flags
& P_OVERFLOW
)
(void)fprintf(stderr
, " lower %3d upper %3d nextind %d\n",
h
->lower
, h
->upper
, top
);
for (cur
= 0; cur
< top
; cur
++) {
(void)fprintf(stderr
, "\t[%03d] %4d ", cur
, h
->linp
[cur
]);
switch(h
->flags
& P_TYPE
) {
bi
= GETBINTERNAL(h
, cur
);
"size %03d pgno %03d", bi
->ksize
, bi
->pgno
);
if (bi
->flags
& P_BIGKEY
)
(void)fprintf(stderr
, " (indirect)");
" {%.*s}", (int)bi
->ksize
, bi
->bytes
);
ri
= GETRINTERNAL(h
, cur
);
(void)fprintf(stderr
, "entries %03d pgno %03d",
if (bl
->flags
& P_BIGKEY
)
"big key page %lu size %u/",
*(size_t *)(bl
->bytes
+ sizeof(pgno_t
)));
(void)fprintf(stderr
, "%s/", bl
->bytes
);
if (bl
->flags
& P_BIGDATA
)
"big data page %lu size %u",
*(pgno_t
*)(bl
->bytes
+ bl
->ksize
),
*(size_t *)(bl
->bytes
+ bl
->ksize
+
(void)fprintf(stderr
, "%.*s",
(int)bl
->dsize
, bl
->bytes
+ bl
->ksize
);
if (rl
->flags
& P_BIGDATA
)
"big data page %lu size %u",
*(size_t *)(rl
->bytes
+ sizeof(pgno_t
)));
"%.*s", (int)rl
->dsize
, rl
->bytes
);
(void)fprintf(stderr
, "\n");
* BT_STAT -- Gather/print the tree statistics
extern u_long bt_cache_hit
, bt_cache_miss
;
extern u_long bt_rootsplit
, bt_split
, bt_sortsplit
;
extern u_long bt_pfxsaved
;
pgno_t i
, pcont
, pinternal
, pleaf
;
u_long ifree
, lfree
, nkeys
;
pcont
= pinternal
= pleaf
= 0;
nkeys
= ifree
= lfree
= 0;
for (i
= P_ROOT
; (h
= mpool_get(t
->bt_mp
, i
, 0)) != NULL
; ++i
) {
switch(h
->flags
& P_TYPE
) {
ifree
+= h
->upper
- h
->lower
;
lfree
+= h
->upper
- h
->lower
;
(void)mpool_put(t
->bt_mp
, h
, 0);
/* Count the levels of the tree. */
for (i
= P_ROOT
, levels
= 0 ;; ++levels
) {
h
= mpool_get(t
->bt_mp
, i
, 0);
if (h
->flags
& (P_BLEAF
|P_RLEAF
)) {
(void)mpool_put(t
->bt_mp
, h
, 0);
GETRINTERNAL(h
, 0)->pgno
:
GETBINTERNAL(h
, 0)->pgno
;
(void)mpool_put(t
->bt_mp
, h
, 0);
(void)fprintf(stderr
, "%d level%s with %ld keys",
levels
, levels
== 1 ? "" : "s", nkeys
);
(void)fprintf(stderr
, " (%ld header count)", t
->bt_nrecs
);
"\n%lu pages (leaf %ld, internal %ld, overflow %ld)\n",
pinternal
+ pleaf
+ pcont
, pleaf
, pinternal
, pcont
);
(void)fprintf(stderr
, "%ld cache hits, %ld cache misses\n",
bt_cache_hit
, bt_cache_miss
);
(void)fprintf(stderr
, "%ld splits (%ld root splits, %ld sort splits)\n",
bt_split
, bt_rootsplit
, bt_sortsplit
);
pleaf
*= t
->bt_psize
- BTDATAOFF
;
"%.0f%% leaf fill (%ld bytes used, %ld bytes free)\n",
((double)(pleaf
- lfree
) / pleaf
) * 100,
pinternal
*= t
->bt_psize
- BTDATAOFF
;
"%.0f%% internal fill (%ld bytes used, %ld bytes free\n",
((double)(pinternal
- ifree
) / pinternal
) * 100,
pinternal
- ifree
, ifree
);
(void)fprintf(stderr
, "prefix checking removed %lu bytes.\n",