1/*-
2 * See the file LICENSE for redistribution information.
3 *
4 * Copyright (c) 1997-2009 Oracle.  All rights reserved.
5 *
6 * $Id$
7 */
8
9#include "db_config.h"
10
11#include "db_int.h"
12#include "dbinc/db_page.h"
13#include "dbinc/db_am.h"
14#include "dbinc/log.h"
15#include "dbinc/txn.h"
16
17#ifdef HAVE_STATISTICS
18static int __dbreg_print_all __P((ENV *, u_int32_t));
19
20/*
21 * __dbreg_stat_print --
22 *	Print the dbreg statistics.
23 *
24 * PUBLIC: int __dbreg_stat_print __P((ENV *, u_int32_t));
25 */
26int
27__dbreg_stat_print(env, flags)
28	ENV *env;
29	u_int32_t flags;
30{
31	int ret;
32
33	if (LF_ISSET(DB_STAT_ALL) &&
34	    (ret = __dbreg_print_all(env, flags)) != 0)
35		return (ret);
36
37	return (0);
38}
39
40/*
41 * __dbreg_print_fname --
42 *	Display the contents of an FNAME structure.
43 *
44 * PUBLIC: void __dbreg_print_fname __P((ENV *, FNAME *));
45 */
46void
47__dbreg_print_fname(env, fnp)
48	ENV *env;
49	FNAME *fnp;
50{
51	static const FN fn[] = {
52		{ DB_FNAME_DURABLE,	"DB_FNAME_DURABLE" },
53		{ DB_FNAME_NOTLOGGED,	"DB_FNAME_NOTLOGGED" },
54		{ 0,			NULL }
55	};
56
57	__db_msg(env, "%s", DB_GLOBAL(db_line));
58	__db_msg(env, "DB handle FNAME contents:");
59	STAT_LONG("log ID", fnp->id);
60	STAT_ULONG("Meta pgno", fnp->meta_pgno);
61	__db_print_fileid(env, fnp->ufid, "\tFile ID");
62	STAT_ULONG("create txn", fnp->create_txnid);
63	__db_prflags(env, NULL, fnp->flags, fn, NULL, "\tFlags");
64}
65
66/*
67 * __dbreg_print_all --
68 *	Display the ENV's list of files.
69 */
70static int
71__dbreg_print_all(env, flags)
72	ENV *env;
73	u_int32_t flags;
74{
75	DB *dbp;
76	DB_LOG *dblp;
77	FNAME *fnp;
78	LOG *lp;
79	int32_t *stack;
80	int del, first;
81	u_int32_t i;
82
83	dblp = env->lg_handle;
84	lp = dblp->reginfo.primary;
85
86	__db_msg(env, "LOG FNAME list:");
87	__mutex_print_debug_single(
88	    env, "File name mutex", lp->mtx_filelist, flags);
89
90	STAT_LONG("Fid max", lp->fid_max);
91	STAT_LONG("Log buffer size", lp->buffer_size);
92
93	MUTEX_LOCK(env, lp->mtx_filelist);
94	first = 1;
95	SH_TAILQ_FOREACH(fnp, &lp->fq, q, __fname) {
96		if (first) {
97			first = 0;
98			__db_msg(env,
99		    "ID\tName\t\tType\tPgno\tPid\tTxnid\tFlags\tDBP-info");
100		}
101		dbp = fnp->id >= dblp->dbentry_cnt ? NULL :
102		    dblp->dbentry[fnp->id].dbp;
103		del = fnp->id >= dblp->dbentry_cnt ? 0 :
104		    dblp->dbentry[fnp->id].deleted;
105		__db_msg(env,
106		    "%ld\t%-8s%s%-8s%s\t%lu\t%lu\t%lx\t%lx\t%s (%d %lx %lx)",
107		    (long)fnp->id,
108		    fnp->fname_off == INVALID_ROFF ?
109			"" : (char *)R_ADDR(&dblp->reginfo, fnp->fname_off),
110		    fnp->dname_off == INVALID_ROFF ? "" : ":",
111		    fnp->dname_off == INVALID_ROFF ?
112			"" : (char *)R_ADDR(&dblp->reginfo, fnp->dname_off),
113		    __db_dbtype_to_string(fnp->s_type),
114		    (u_long)fnp->meta_pgno, (u_long)fnp->pid,
115		    (u_long)fnp->create_txnid, (u_long)fnp->flags,
116		    dbp == NULL ? "No DBP" : "DBP", del, P_TO_ULONG(dbp),
117		    (u_long)(dbp == NULL ? 0 : dbp->flags));
118	}
119	MUTEX_UNLOCK(env, lp->mtx_filelist);
120
121	__db_msg(env, "%s", DB_GLOBAL(db_line));
122	__db_msg(env, "LOG region list of free IDs.");
123	if (lp->free_fid_stack == INVALID_ROFF)
124		__db_msg(env, "Free id stack is empty.");
125	else {
126		STAT_ULONG("Free id array size", lp->free_fids_alloced);
127		STAT_ULONG("Number of ids on the free stack", lp->free_fids);
128		stack = R_ADDR(&dblp->reginfo, lp->free_fid_stack);
129		for (i = 0; i < lp->free_fids; i++)
130			STAT_LONG("fid", stack[i]);
131	}
132
133	return (0);
134}
135#endif
136