diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2018-05-24 11:35:24 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2018-05-24 11:35:24 +0300 |
commit | 371bb85fe378ffd0ed6ddc81985d450cef5835a3 (patch) | |
tree | 6ab2d142b7aa1f9b29ec50b891c8293774964209 /src/gdbmtool.c | |
parent | f82d0b213fd2cdce80dc891906fba8d589115664 (diff) | |
download | gdbm-371bb85fe378ffd0ed6ddc81985d450cef5835a3.tar.gz gdbm-371bb85fe378ffd0ed6ddc81985d450cef5835a3.tar.bz2 |
More error checking; improve gdbm_recover
* Makefile.am (set-dist-date): New rule
(dist-hook): Catch FIXMEs in NEWS.
* NEWS: Updated.
* src/findkey.c (gdbm_bucket_element_valid_p): New function.
(_gdbm_read_entry): Validate the retrieved bucket element.
* src/gdbm.h.in (gdbm_recovery): New member: duplicate_keys.
(GDBM_BAD_HASH_TABLE): New error code.
* src/gdbmdefs.h (TYPE_WIDTH,SIGNED_TYPE_MAXIMUM)
(OFF_T_MAX): New defines.
(off_t_sum_ok): New function.
(gdbm_bucket_element_valid_p): New prototype.
* src/gdbmerrno.c: Support for GDBM_BAD_HASH_TABLE code.
* src/gdbmtool.c (recover_handler): Fix argument counting.
New argument 'summary' prints statistics summary at the end
of the run.
(export_handler,import_handler): Fix argument counting.
* src/mmap.c (SUM_FILE_SIZE): Rewrite as inlined function.
Add error checking.
(_gdbm_mapped_remap): More error checking.
* src/recover.c (run_recovery): Don't bail out on GDBM_CANNOT_REPLACE.
(gdbm_recover): Initialize duplicate_keys
* src/systems.h: Include limits.h
Diffstat (limited to 'src/gdbmtool.c')
-rw-r--r-- | src/gdbmtool.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/src/gdbmtool.c b/src/gdbmtool.c index 33bdf93..9c6eebe 100644 --- a/src/gdbmtool.c +++ b/src/gdbmtool.c @@ -552,7 +552,7 @@ err_printer (void *data GDBM_ARG_UNUSED, char const *fmt, ...) fprintf (stderr, "\n"); } -/* recover verbose backup max-failed-keys=N max-failed-buckets=N max-failures=N */ +/* recover sumamry verbose backup max-failed-keys=N max-failed-buckets=N max-failures=N */ void recover_handler (struct handler_param *param) { @@ -561,8 +561,9 @@ recover_handler (struct handler_param *param) int rc; int i; char *p; + int summary = 0; - for (i = 1; i < param->argc; i++) + for (i = 0; i < param->argc; i++) { char *arg = PARAM_STRING (param, i); if (strcmp (arg, "verbose") == 0) @@ -570,6 +571,10 @@ recover_handler (struct handler_param *param) rcvr.errfun = err_printer; flags |= GDBM_RCVR_ERRFUN; } + else if (strcmp (arg, "summary") == 0) + { + summary = 1; + } else if (strcmp (arg, "backup") == 0) { rcvr.errfun = err_printer; @@ -617,6 +622,19 @@ recover_handler (struct handler_param *param) if (rc == 0) { fprintf (param->fp, _("Recovery succeeded.\n")); + if (summary) + { + fprintf (param->fp, + _("Keys recovered: %lu, failed: %lu, duplicate: %lu\n"), + (unsigned long) rcvr.recovered_keys, + (unsigned long) rcvr.failed_keys, + (unsigned long) rcvr.duplicate_keys); + fprintf (param->fp, + _("Buckets recovered: %lu, failed: %lu\n"), + (unsigned long) rcvr.recovered_buckets, + (unsigned long) rcvr.failed_buckets); + } + if (rcvr.backup_name) { fprintf (param->fp, @@ -925,7 +943,7 @@ export_handler (struct handler_param *param) int i; int filemode; - for (i = 1; i < param->argc; i++) + for (i = 0; i < param->argc; i++) { if (strcmp (PARAM_STRING (param, i), "truncate") == 0) flags = GDBM_NEWDB; @@ -959,7 +977,7 @@ import_handler (struct handler_param *param) int i; int rc; - for (i = 1; i < param->argc; i++) + for (i = 0; i < param->argc; i++) { if (strcmp (PARAM_STRING (param, i), "replace") == 0) flag = GDBM_REPLACE; @@ -1220,6 +1238,7 @@ struct command command_tab[] = { { S(recover), T_CMD, checkdb, recover_handler, NULL, { { "[verbose]", GDBM_ARG_STRING }, + { "[summary]", GDBM_ARG_STRING }, { "[backup]", GDBM_ARG_STRING }, { "[max-failed-keys=N]", GDBM_ARG_STRING }, { "[max-failed-buckets=N]", GDBM_ARG_STRING }, |