diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2016-07-19 12:01:48 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2016-07-19 12:58:16 +0300 |
commit | 85f1e72da83e3078e2ae1f78093ef0966e43cec1 (patch) | |
tree | b00707979e9088d5f7b7880d438260eb063c9160 /tests | |
parent | 8e83f209342e2b035bbb19efa87ec5295158ef65 (diff) | |
download | gdbm-85f1e72da83e3078e2ae1f78093ef0966e43cec1.tar.gz gdbm-85f1e72da83e3078e2ae1f78093ef0966e43cec1.tar.bz2 |
Implement gdbm_recover function
* configure.ac: Don't check for rename.
* src/Makefile.am (libgdbm_la_SOURCES): Add recover.c
* src/recover.c: New file.
* src/bucket.c (_gdbm_get_bucket): Remove extra space before [
* src/err.c (prerror): Take additional argument
(gdbm_perror): Print system errno if necessary.
* src/gdbm.h.in (GDBM_CLOERROR): New flag.
(gdbm_fd_open, gdbm_copy_meta): New proto.
(gdbm_last_syserr,gdbm_db_strerror,gdbm_recover): New proto.
(gdbm_syserr): New extern.
(gdbm_recovery): New struct.
(GDBM_RCVR_DEFAULT,GDBM_RCVR_ERRFUN)
(GDBM_RCVR_MAX_FAILED_KEYS)
(GDBM_RCVR_MAX_FAILED_BUCKETS)
(GDBM_RCVR_MAX_FAILURES)
(GDBM_RCVR_BACKUP): New flags.
(GDBM_BACKUP_FAILED): New error code.
* src/gdbmclose.c (gdbm_close): Work correctly if dbf->desc == -1.
* src/gdbmcount.c (gdbm_count): Remove spurious sorting.
Use _gdbm_next_bucket_dir for iterating over the buckets.
* src/gdbmdefs.h (struct gdbm_file_info)<last_syserror>
<last_errstr>: New members.
* src/gdbmerrno.c (gdbm_set_errno): Set last_syserror as well.
(gdbm_clear_error): Reset last_syserror.
(gdbm_last_syserr): New function.
(gdbm_errlist): New entry for GDBM_BACKUP_FAILED.
(gdbm_db_strerror): New function.
(gdbm_syserr): New global.
* src/gdbmload.c (get_parms): Buffer can be NULL.
* src/gdbmopen.c (gdbm_fd_open): New function.
(gdbm_open): Rewrite as a wrapper over gdbm_fd_open.
* src/gdbmreorg.c (gdbm_reorganize): Rewrite as a wrapper
over gdbm_recover.
* src/proto.h (_gdbm_next_bucket_dir): New proto.
* src/gdbmtool.c: New command: recover.
* tests/.gitignore: Add gtrecover
* tests/gtrecover.c: New test program.
* tests/Makefile.am: Build gtrecover
Diffstat (limited to 'tests')
-rw-r--r-- | tests/.gitignore | 1 | ||||
-rw-r--r-- | tests/Makefile.am | 2 | ||||
-rw-r--r-- | tests/gtrecover.c | 124 |
3 files changed, 127 insertions, 0 deletions
diff --git a/tests/.gitignore b/tests/.gitignore index 0883563..a339f8d 100644 --- a/tests/.gitignore +++ b/tests/.gitignore | |||
@@ -18,6 +18,7 @@ gtdump | |||
18 | gtfetch | 18 | gtfetch |
19 | gtload | 19 | gtload |
20 | gtopt | 20 | gtopt |
21 | gtrecover | ||
21 | gtver | 22 | gtver |
22 | num2word | 23 | num2word |
23 | package.m4 | 24 | package.m4 |
diff --git a/tests/Makefile.am b/tests/Makefile.am index f706213..a95db7e 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am | |||
@@ -113,6 +113,7 @@ check_PROGRAMS = \ | |||
113 | gtfetch\ | 113 | gtfetch\ |
114 | gtload\ | 114 | gtload\ |
115 | gtopt\ | 115 | gtopt\ |
116 | gtrecover\ | ||
116 | gtver\ | 117 | gtver\ |
117 | num2word\ | 118 | num2word\ |
118 | $(DBMPROGS) | 119 | $(DBMPROGS) |
@@ -125,6 +126,7 @@ gtdump_LDADD = ../src/libgdbm.la | |||
125 | gtfetch_LDADD = ../src/libgdbm.la | 126 | gtfetch_LDADD = ../src/libgdbm.la |
126 | gtver_LDADD = ../src/libgdbm.la | 127 | gtver_LDADD = ../src/libgdbm.la |
127 | gtopt_LDADD = ../src/libgdbm.la | 128 | gtopt_LDADD = ../src/libgdbm.la |
129 | gtrecover_LDADD = ../src/libgdbm.la | ||
128 | 130 | ||
129 | g_open_ce_LDADD = ../src/libgdbm.la | 131 | g_open_ce_LDADD = ../src/libgdbm.la |
130 | g_reorg_ce_LDADD = ../src/libgdbm.la | 132 | g_reorg_ce_LDADD = ../src/libgdbm.la |
diff --git a/tests/gtrecover.c b/tests/gtrecover.c new file mode 100644 index 0000000..7bb1f1e --- /dev/null +++ b/tests/gtrecover.c | |||
@@ -0,0 +1,124 @@ | |||
1 | /* This file is part of GDBM test suite. | ||
2 | Copyright (C) 2016 Free Software Foundation, Inc. | ||
3 | |||
4 | GDBM is free software; you can redistribute it and/or modify | ||
5 | it under the terms of the GNU General Public License as published by | ||
6 | the Free Software Foundation; either version 2, or (at your option) | ||
7 | any later version. | ||
8 | |||
9 | GDBM is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | GNU General Public License for more details. | ||
13 | |||
14 | You should have received a copy of the GNU General Public License | ||
15 | along with GDBM. If not, see <http://www.gnu.org/licenses/>. | ||
16 | */ | ||
17 | #include "autoconf.h" | ||
18 | #include <stdio.h> | ||
19 | #include <stdlib.h> | ||
20 | #include <stdarg.h> | ||
21 | #include <string.h> | ||
22 | #include "gdbm.h" | ||
23 | #include "progname.h" | ||
24 | #include <assert.h> | ||
25 | |||
26 | const char *progname; | ||
27 | |||
28 | void | ||
29 | err_printer (void *data, char const *fmt, ...) | ||
30 | { | ||
31 | va_list ap; | ||
32 | |||
33 | fprintf (stderr, "%s: ", progname); | ||
34 | va_start (ap, fmt); | ||
35 | vfprintf (stderr, fmt, ap); | ||
36 | va_end (ap); | ||
37 | fprintf (stderr, "\n"); | ||
38 | } | ||
39 | |||
40 | int | ||
41 | main (int argc, char **argv) | ||
42 | { | ||
43 | const char *dbname; | ||
44 | GDBM_FILE dbf; | ||
45 | int rc = 0; | ||
46 | int open_flags = GDBM_WRITER; | ||
47 | gdbm_recovery rcvr; | ||
48 | int rcvr_flags = 0; | ||
49 | char *p; | ||
50 | |||
51 | progname = canonical_progname (argv[0]); | ||
52 | while (--argc) | ||
53 | { | ||
54 | char *arg = *++argv; | ||
55 | |||
56 | if (strcmp (arg, "-h") == 0) | ||
57 | { | ||
58 | printf ("usage: %s [-nolock] [-nommap] [-verbose] [-backup] [-max-failures=N] [-max-failed-keys=N] [-max-failed-buckets=N] DBFILE\n", | ||
59 | progname); | ||
60 | exit (0); | ||
61 | } | ||
62 | else if (strcmp (arg, "-nolock") == 0) | ||
63 | open_flags |= GDBM_NOLOCK; | ||
64 | else if (strcmp (arg, "-nommap") == 0) | ||
65 | open_flags |= GDBM_NOMMAP; | ||
66 | else if (strcmp (arg, "-verbose") == 0) | ||
67 | { | ||
68 | rcvr.errfun = err_printer; | ||
69 | rcvr_flags |= GDBM_RCVR_ERRFUN; | ||
70 | } | ||
71 | else if (strcmp (arg, "-backup") == 0) | ||
72 | rcvr_flags |= GDBM_RCVR_BACKUP; | ||
73 | else if (strncmp (arg, "-max-failures=", 14) == 0) | ||
74 | { | ||
75 | rcvr.max_failures = strtoul (arg + 14, &p, 10); | ||
76 | assert (*p == 0); | ||
77 | rcvr_flags |= GDBM_RCVR_MAX_FAILURES; | ||
78 | } | ||
79 | else if (strncmp (arg, "-max-failed-keys=", 17) == 0) | ||
80 | { | ||
81 | rcvr.max_failed_keys = strtoul (arg + 17, &p, 10); | ||
82 | assert (*p == 0); | ||
83 | rcvr_flags |= GDBM_RCVR_MAX_FAILED_KEYS; | ||
84 | } | ||
85 | else if (strncmp (arg, "-max-failed-buckets=", 20) == 0) | ||
86 | { | ||
87 | rcvr.max_failures = strtoul (arg + 20, &p, 10); | ||
88 | assert (*p == 0); | ||
89 | rcvr_flags |= GDBM_RCVR_MAX_FAILED_BUCKETS; | ||
90 | } | ||
91 | else if (strcmp (arg, "--") == 0) | ||
92 | { | ||
93 | --argc; | ||
94 | ++argv; | ||
95 | break; | ||
96 | } | ||
97 | else if (arg[0] == '-') | ||
98 | { | ||
99 | fprintf (stderr, "%s: unknown option %s\n", progname, arg); | ||
100 | exit (1); | ||
101 | } | ||
102 | else | ||
103 | break; | ||
104 | } | ||
105 | |||
106 | if (argc < 1) | ||
107 | { | ||
108 | fprintf (stderr, "%s: wrong arguments\n", progname); | ||
109 | exit (1); | ||
110 | } | ||
111 | dbname = *argv; | ||
112 | |||
113 | dbf = gdbm_open (dbname, 0, open_flags, 0, NULL); | ||
114 | if (!dbf) | ||
115 | { | ||
116 | fprintf (stderr, "gdbm_open failed: %s\n", gdbm_strerror (gdbm_errno)); | ||
117 | exit (1); | ||
118 | } | ||
119 | |||
120 | rc = gdbm_recover (dbf, &rcvr, rcvr_flags); | ||
121 | |||
122 | gdbm_close (dbf); | ||
123 | exit (rc); | ||
124 | } | ||