1/*-
2 * See the file LICENSE for redistribution information.
3 *
4 * Copyright (c) 1997,2008 Oracle.  All rights reserved.
5 *
6 * $Id: dbreg_stat.c,v 12.17 2008/03/12 20:46:37 mbrey Exp $
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_dblist __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_dblist(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_dblist --
68 *	Display the ENV's list of files.
69 */
70static int
71__dbreg_print_dblist(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	int del, first;
80
81	dblp = env->lg_handle;
82	lp = dblp->reginfo.primary;
83
84	__db_msg(env, "LOG FNAME list:");
85	__mutex_print_debug_single(
86	    env, "File name mutex", lp->mtx_filelist, flags);
87
88	STAT_LONG("Fid max", lp->fid_max);
89
90	MUTEX_LOCK(env, lp->mtx_filelist);
91	first = 1;
92	SH_TAILQ_FOREACH(fnp, &lp->fq, q, __fname) {
93		if (first) {
94			first = 0;
95			__db_msg(env,
96		    "ID\tName\t\tType\tPgno\tPid\tTxnid\tFlags\tDBP-info");
97		}
98		dbp = fnp->id >= dblp->dbentry_cnt ? NULL :
99		    dblp->dbentry[fnp->id].dbp;
100		del = fnp->id >= dblp->dbentry_cnt ? 0 :
101		    dblp->dbentry[fnp->id].deleted;
102		__db_msg(env,
103		    "%ld\t%-8s%s%-8s%s\t%lu\t%lu\t%lx\t%lx\t%s (%d %lx %lx)",
104		    (long)fnp->id,
105		    fnp->fname_off == INVALID_ROFF ?
106			"" : (char *)R_ADDR(&dblp->reginfo, fnp->fname_off),
107		    fnp->dname_off == INVALID_ROFF ? "" : ":",
108		    fnp->dname_off == INVALID_ROFF ?
109			"" : (char *)R_ADDR(&dblp->reginfo, fnp->dname_off),
110		    __db_dbtype_to_string(fnp->s_type),
111		    (u_long)fnp->meta_pgno, (u_long)fnp->pid,
112		    (u_long)fnp->create_txnid, (u_long)fnp->flags,
113		    dbp == NULL ? "No DBP" : "DBP", del, P_TO_ULONG(dbp),
114		    (u_long)(dbp == NULL ? 0 : dbp->flags));
115	}
116	MUTEX_UNLOCK(env, lp->mtx_filelist);
117
118	return (0);
119}
120#endif
121