qam_stat.c

Go to the documentation of this file.
00001 /*-
00002  * See the file LICENSE for redistribution information.
00003  *
00004  * Copyright (c) 1999, 2000
00005  *      Sleepycat Software.  All rights reserved.
00006  */
00007 
00008 #include "config.h"
00009 
00010 #ifndef lint
00011 static const char revid[] = "$Id: qam__stat_8c-source.html,v 1.1 2008/06/08 10:21:46 sebdiaz Exp $";
00012 #endif /* not lint */
00013 
00014 #ifndef NO_SYSTEM_INCLUDES
00015 #include <sys/types.h>
00016 
00017 #include <string.h>
00018 #endif
00019 
00020 #include "db_int.h"
00021 #include "db_page.h"
00022 #include "db_shash.h"
00023 #include "db_am.h"
00024 #include "lock.h"
00025 #include "qam.h"
00026 
00027 /*
00028  * CDB___qam_stat --
00029  *      Gather/print the qam statistics
00030  *
00031  * PUBLIC: int CDB___qam_stat __P((DB *, void *, void *(*)(size_t), u_int32_t));
00032  */
00033 int
00034 CDB___qam_stat(dbp, spp, db_malloc, flags)
00035         DB *dbp;
00036         void *spp;
00037         void *(*db_malloc) __P((size_t));
00038         u_int32_t flags;
00039 {
00040         QUEUE *t;
00041         DBC *dbc;
00042         DB_LOCK lock;
00043         DB_QUEUE_STAT *sp;
00044         PAGE *h;
00045         QAMDATA *qp, *ep;
00046         QMETA *meta;
00047         db_indx_t indx;
00048         db_pgno_t lastpgno, pgno;
00049         u_int32_t re_len;
00050         int ret, t_ret;
00051 
00052         PANIC_CHECK(dbp->dbenv);
00053         DB_ILLEGAL_BEFORE_OPEN(dbp, "DB->stat");
00054 
00055         t = dbp->q_internal;
00056         sp = NULL;
00057         lock.off = LOCK_INVALID;
00058 
00059         /* Check for invalid flags. */
00060         if ((ret = CDB___db_statchk(dbp, flags)) != 0)
00061                 return (ret);
00062 
00063         if (spp == NULL)
00064                 return (0);
00065 
00066         /* Acquire a cursor. */
00067         if ((ret = dbp->cursor(dbp, NULL, &dbc, 0)) != 0)
00068                 return (ret);
00069 
00070         DEBUG_LWRITE(dbc, NULL, "qam_stat", NULL, NULL, flags);
00071 
00072         /* Allocate and clear the structure. */
00073         if ((ret = CDB___os_malloc(dbp->dbenv, sizeof(*sp), db_malloc, &sp)) != 0)
00074                 goto err;
00075         memset(sp, 0, sizeof(*sp));
00076 
00077         re_len = ((QUEUE *)dbp->q_internal)->re_len;
00078         if (flags == DB_CACHED_COUNTS) {
00079                 if ((ret = CDB___db_lget(dbc,
00080                     0, t->q_meta, DB_LOCK_READ, 0, &lock)) != 0)
00081                         goto err;
00082                 if ((ret =
00083                     CDB_memp_fget(dbp->mpf, &t->q_meta, 0, (PAGE **)&meta)) != 0)
00084                         goto err;
00085                 sp->qs_nkeys = meta->dbmeta.key_count;
00086                 sp->qs_ndata = meta->dbmeta.record_count;
00087 
00088                 goto done;
00089         }
00090 
00091         /* Determine the last page of the database. */
00092         if ((ret = CDB_memp_fget(dbp->mpf, &lastpgno, DB_MPOOL_LAST, &h)) != 0)
00093                 goto err;
00094         if ((ret = CDB_memp_fput(dbp->mpf, h, 0)) != 0)
00095                 goto err;
00096 
00097         /* Walk through the pages and count. */
00098         for (pgno = t->q_root; pgno <= lastpgno; ++pgno) {
00099                 if ((ret =
00100                     CDB___db_lget(dbc, 0, pgno, DB_LOCK_READ, 0, &lock)) != 0)
00101                         goto err;
00102                 if ((ret = CDB_memp_fget(dbp->mpf, &pgno, 0, &h)) != 0)
00103                         goto err;
00104 
00105                 ++sp->qs_pages;
00106 
00107                 ep = (QAMDATA *)((u_int8_t *)h + dbp->pgsize - re_len);
00108                 for (indx = 0, qp = QAM_GET_RECORD(dbp, h, indx);
00109                     qp <= ep;
00110                     ++indx,  qp = QAM_GET_RECORD(dbp, h, indx)) {
00111                         if (F_ISSET(qp, QAM_VALID))
00112                                 sp->qs_ndata++;
00113                         else
00114                                 sp->qs_pgfree += re_len;
00115                 }
00116 
00117                 if ((ret = CDB_memp_fput(dbp->mpf, h, 0)) != 0)
00118                         goto err;
00119                 (void)__LPUT(dbc, lock);
00120         }
00121 
00122         /* Get the meta-data page. */
00123         if ((ret = CDB___db_lget(dbc,
00124             0, t->q_meta, F_ISSET(dbp, DB_AM_RDONLY) ?
00125             DB_LOCK_READ : DB_LOCK_WRITE, 0, &lock)) != 0)
00126                 goto err;
00127         if ((ret = CDB_memp_fget(dbp->mpf, &t->q_meta, 0, (PAGE **)&meta)) != 0)
00128                 goto err;
00129 
00130         /* Get the metadata fields. */
00131         sp->qs_magic = meta->dbmeta.magic;
00132         sp->qs_version = meta->dbmeta.version;
00133         sp->qs_metaflags = meta->dbmeta.flags;
00134         sp->qs_pagesize = meta->dbmeta.pagesize;
00135         sp->qs_re_len = meta->re_len;
00136         sp->qs_re_pad = meta->re_pad;
00137         sp->qs_start = meta->start;
00138         sp->qs_first_recno = meta->first_recno;
00139         sp->qs_cur_recno = meta->cur_recno;
00140         sp->qs_nkeys = sp->qs_ndata;
00141         if (!F_ISSET(dbp, DB_AM_RDONLY))
00142                 meta->dbmeta.key_count =
00143                     meta->dbmeta.record_count = sp->qs_ndata;
00144 
00145 done:
00146         /* Discard the meta-data page. */
00147         if ((ret = CDB_memp_fput(dbp->mpf, meta, !F_ISSET(dbp, DB_AM_RDONLY))) != 0)
00148                 goto err;
00149         (void)__LPUT(dbc, lock);
00150 
00151         *(DB_QUEUE_STAT **)spp = sp;
00152         ret = 0;
00153 
00154         if (0) {
00155 err:            if (sp != NULL)
00156                         CDB___os_free(sp, sizeof(*sp));
00157         }
00158 
00159         if (lock.off != LOCK_INVALID)
00160                 (void)__LPUT(dbc, lock);
00161 
00162         if ((t_ret = dbc->c_close(dbc)) != 0 && ret == 0)
00163                 ret = t_ret;
00164 
00165         return (ret);
00166 }

Generated on Sun Jun 8 10:56:39 2008 for GNUmifluz by  doxygen 1.5.5