From 02bc2dc9bee96c0e7d93d23c6f0b7a24d0e17566 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Sun, 15 Mar 2020 17:32:42 +0200 Subject: Implement the gdbm_bucket_count function. * src/gdbmcount.c (gdbm_bucket_count): New function. * src/gdbm.h.in (gdbm_bucket_count): New proto. * doc/gdbm.texi: Document gdbm_bucket_count. * src/gdbmtool.c (bucket_count): Reimplement via gdbm_bucket_count. --- doc/gdbm.texi | 9 +++++++++ src/gdbm.h.in | 2 ++ src/gdbmcount.c | 16 ++++++++++++++++ src/gdbmtool.c | 12 +++--------- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/doc/gdbm.texi b/doc/gdbm.texi index 159a108..53c9782 100644 --- a/doc/gdbm.texi +++ b/doc/gdbm.texi @@ -232,6 +232,7 @@ int gdbm_export_to_file (GDBM_FILE dbf, FILE *fp); int gdbm_import (GDBM_FILE, const char *, int); int gdbm_import_from_file (GDBM_FILE dbf, FILE *fp, int flag); int gdbm_count (GDBM_FILE dbf, gdbm_count_t *pcount); +int gdbm_bucket_count (GDBM_FILE dbf, size_t *pcount); int gdbm_version_cmp (int const a[], int const b[]); @end example @@ -394,6 +395,14 @@ stores it in the memory location pointed to by @var{pcount} and return and returns -1. @end deftypefn +@deftypefn {gdbm interface} int gdbm_bucket_count (GDBM_FILE @var{dbf}, @ + size_t *@var{pcount}) +Counts number of buckets in the database @var{dbf}. On success, +stores it in the memory location pointed to by @var{pcount} and return +0. On error, sets @code{gdbm_errno} (if relevant, also @code{errno}) +and returns -1. +@end deftypefn + @node Store @chapter Inserting and replacing records in the database. @cindex storing records diff --git a/src/gdbm.h.in b/src/gdbm.h.in index 804e051..668af7c 100644 --- a/src/gdbm.h.in +++ b/src/gdbm.h.in @@ -133,6 +133,8 @@ extern int gdbm_import (GDBM_FILE, const char *, int); extern int gdbm_import_from_file (GDBM_FILE dbf, FILE *fp, int flag); extern int gdbm_count (GDBM_FILE dbf, gdbm_count_t *pcount); +extern int gdbm_bucket_count (GDBM_FILE dbf, size_t *pcount); + typedef struct gdbm_recovery_s { diff --git a/src/gdbmcount.c b/src/gdbmcount.c index 4a78bc0..c81a461 100644 --- a/src/gdbmcount.c +++ b/src/gdbmcount.c @@ -40,3 +40,19 @@ gdbm_count (GDBM_FILE dbf, gdbm_count_t *pcount) *pcount = count; return 0; } + +int +gdbm_bucket_count (GDBM_FILE dbf, size_t *pcount) +{ + int i; + size_t count = 0; + + GDBM_ASSERT_CONSISTENCY (dbf, -1); + + for (i = 0; i < GDBM_DIR_COUNT (dbf); i = _gdbm_next_bucket_dir (dbf, i)) + { + ++count; + } + *pcount = count; + return 0; +} diff --git a/src/gdbmtool.c b/src/gdbmtool.c index f9a4924..f439207 100644 --- a/src/gdbmtool.c +++ b/src/gdbmtool.c @@ -788,17 +788,11 @@ print_dir_begin (struct handler_param *param GDBM_ARG_UNUSED, size_t *exp_count) static size_t bucket_count (void) { - int i; - off_t last = 0; size_t count = 0; - - for (i = 0; i < GDBM_DIR_COUNT (gdbm_file); i++) + + if (gdbm_bucket_count (gdbm_file, &count)) { - if (gdbm_file->dir[i] != last) - { - ++count; - last = gdbm_file->dir[i]; - } + terror ("gdbm_bucket_count: %s", gdbm_strerror (gdbm_errno)); } return count; } -- cgit v1.2.1