VALUE
bdb_tree_stat(int argc, VALUE *argv, VALUE obj)
{
bdb_DB *dbst;
DB_BTREE_STAT *bdb_stat;
VALUE hash, flagv;
char pad;
int flags = 0;
#if HAVE_DB_STAT_4_TXN
DB_TXN *txnid = NULL;
#endif
if (rb_scan_args(argc, argv, "01", &flagv) == 1) {
flags = NUM2INT(flagv);
}
GetDB(obj, dbst);
#if HAVE_DB_STAT_4
#if HAVE_DB_STAT_4_TXN
if (RTEST(dbst->txn)) {
bdb_TXN *txnst;
GetTxnDB(dbst->txn, txnst);
txnid = txnst->txnid;
}
bdb_test_error(dbst->dbp->stat(dbst->dbp, txnid, &bdb_stat, flags));
#else
bdb_test_error(dbst->dbp->stat(dbst->dbp, &bdb_stat, 0, flags));
#endif
#else
bdb_test_error(dbst->dbp->stat(dbst->dbp, &bdb_stat, flags));
#endif
hash = rb_hash_new();
rb_hash_aset(hash, rb_tainted_str_new2("bt_magic"), INT2NUM(bdb_stat->bt_magic));
rb_hash_aset(hash, rb_tainted_str_new2("bt_version"), INT2NUM(bdb_stat->bt_version));
rb_hash_aset(hash, rb_tainted_str_new2("bt_dup_pg"), INT2NUM(bdb_stat->bt_dup_pg));
rb_hash_aset(hash, rb_tainted_str_new2("bt_dup_pgfree"), INT2NUM(bdb_stat->bt_dup_pgfree));
rb_hash_aset(hash, rb_tainted_str_new2("bt_free"), INT2NUM(bdb_stat->bt_free));
rb_hash_aset(hash, rb_tainted_str_new2("bt_int_pg"), INT2NUM(bdb_stat->bt_int_pg));
rb_hash_aset(hash, rb_tainted_str_new2("bt_int_pgfree"), INT2NUM(bdb_stat->bt_int_pgfree));
rb_hash_aset(hash, rb_tainted_str_new2("bt_leaf_pg"), INT2NUM(bdb_stat->bt_leaf_pg));
rb_hash_aset(hash, rb_tainted_str_new2("bt_leaf_pgfree"), INT2NUM(bdb_stat->bt_leaf_pgfree));
rb_hash_aset(hash, rb_tainted_str_new2("bt_levels"), INT2NUM(bdb_stat->bt_levels));
rb_hash_aset(hash, rb_tainted_str_new2("bt_minkey"), INT2NUM(bdb_stat->bt_minkey));
#if HAVE_ST_DB_BTREE_STAT_BT_NRECS
rb_hash_aset(hash, rb_tainted_str_new2("bt_nrecs"), INT2NUM(bdb_stat->bt_nrecs));
#endif
#if HAVE_ST_DB_BTREE_STAT_BT_NKEYS
rb_hash_aset(hash, rb_tainted_str_new2("bt_nkeys"), INT2NUM(bdb_stat->bt_nkeys));
#if ! HAVE_ST_DB_BTREE_STAT_BT_NRECS
rb_hash_aset(hash, rb_tainted_str_new2("bt_nrecs"), INT2NUM(bdb_stat->bt_nkeys));
#endif
#endif
#if HAVE_ST_DB_BTREE_STAT_BT_NDATA
rb_hash_aset(hash, rb_tainted_str_new2("bt_ndata"), INT2NUM(bdb_stat->bt_ndata));
#endif
rb_hash_aset(hash, rb_tainted_str_new2("bt_over_pg"), INT2NUM(bdb_stat->bt_over_pg));
rb_hash_aset(hash, rb_tainted_str_new2("bt_over_pgfree"), INT2NUM(bdb_stat->bt_over_pgfree));
rb_hash_aset(hash, rb_tainted_str_new2("bt_pagesize"), INT2NUM(bdb_stat->bt_pagesize));
rb_hash_aset(hash, rb_tainted_str_new2("bt_re_len"), INT2NUM(bdb_stat->bt_re_len));
pad = (char)bdb_stat->bt_re_pad;
rb_hash_aset(hash, rb_tainted_str_new2("bt_re_pad"), rb_tainted_str_new(&pad, 1));
#if HAVE_ST_DB_BTREE_STAT_BT_PAGECNT
rb_hash_aset(hash, rb_tainted_str_new2("bt_pagecnt"), INT2NUM(bdb_stat->bt_pagecnt));
#endif
free(bdb_stat);
return hash;
}