1 /* mdb_stat.c - memory-mapped database status tool */
3 * Copyright 2011 Howard Chu, Symas Corp.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted only as authorized by the OpenLDAP
10 * A copy of this license is available in the file LICENSE in the
11 * top-level directory of the distribution or, alternatively, at
12 * <http://www.OpenLDAP.org/license.html>.
20 static void prstat(MDB_stat *ms)
22 printf("Page size: %u\n", ms->ms_psize);
23 printf("Tree depth: %u\n", ms->ms_depth);
24 printf("Branch pages: %zu\n", ms->ms_branch_pages);
25 printf("Leaf pages: %zu\n", ms->ms_leaf_pages);
26 printf("Overflow pages: %zu\n", ms->ms_overflow_pages);
27 printf("Entries: %zu\n", ms->ms_entries);
30 static void usage(char *prog)
32 fprintf(stderr, "usage: %s dbpath [-a|-s subdb]\n", prog);
36 int main(int argc, char *argv[])
47 int alldbs = 0, envinfo = 0;
53 /* -a: print stat of main DB and all subDBs
54 * -s: print stat of only the named subDB
56 * (default) print stat of only the main DB
58 while ((i = getopt(argc, argv, "aes:")) != EOF) {
70 fprintf(stderr, "%s: unrecognized option -%c\n", prog, optopt);
75 if (optind != argc - 1)
78 envname = argv[optind];
79 rc = mdb_env_create(&env);
81 if (alldbs || subname) {
82 mdb_env_set_maxdbs(env, 4);
85 rc = mdb_env_open(env, envname, MDB_RDONLY, 0664);
87 printf("mdb_env_open failed, error %d %s\n", rc, mdb_strerror(rc));
90 rc = mdb_txn_begin(env, NULL, MDB_RDONLY, &txn);
92 printf("mdb_txn_begin failed, error %d %s\n", rc, mdb_strerror(rc));
97 rc = mdb_env_info(env, &mei);
98 printf("Map size: %zu \n", mei.me_mapsize);
99 printf("Last transaction ID: %zu\n", mei.me_last_txnid);
100 printf("Last page used: %zu\n", mei.me_last_pgno);
101 printf("Max readers: %u\n", mei.me_maxreaders);
102 printf("Number of readers used: %u\n", mei.me_numreaders);
105 rc = mdb_open(txn, subname, 0, &dbi);
107 printf("mdb_open failed, error %d %s\n", rc, mdb_strerror(rc));
111 rc = mdb_stat(txn, dbi, &mst);
113 printf("mdb_stat failed, error %d %s\n", rc, mdb_strerror(rc));
122 rc = mdb_cursor_open(txn, dbi, &cursor);
124 printf("mdb_cursor_open failed, error %d %s\n", rc, mdb_strerror(rc));
127 while ((rc = mdb_cursor_get(cursor, &key, NULL, MDB_NEXT)) == 0) {
128 char *str = malloc(key.mv_size+1);
130 memcpy(str, key.mv_data, key.mv_size);
131 str[key.mv_size] = '\0';
132 rc = mdb_open(txn, str, 0, &db2);
133 if (rc == MDB_SUCCESS)
134 printf("\n%s\n", str);
137 rc = mdb_stat(txn, db2, &mst);
139 printf("mdb_stat failed, error %d %s\n", rc, mdb_strerror(rc));
145 mdb_cursor_close(cursor);
154 return rc ? EXIT_FAILURE : EXIT_SUCCESS;