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 /src/gdbm.h.in | |
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 'src/gdbm.h.in')
-rw-r--r-- | src/gdbm.h.in | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/src/gdbm.h.in b/src/gdbm.h.in index 404d079..fc60e46 100644 --- a/src/gdbm.h.in +++ b/src/gdbm.h.in @@ -52,6 +52,7 @@ extern "C" { # define GDBM_BSEXACT 0x200 /* Don't adjust block_size. Bail out with GDBM_BLOCK_SIZE_ERROR error if unable to set it. */ +# define GDBM_CLOERROR 0x400 /* Only for gdbm_fd_open: close fd on error. */ /* Parameters to gdbm_store for simple insertion or replacement in the case that the key is already in the database. */ @@ -107,6 +108,8 @@ extern int const gdbm_version_number[3]; /* GDBM external functions. */ +extern GDBM_FILE gdbm_fd_open (int fd, const char *file_name, int block_size, + int flags, void (*fatal_func) (const char *)); extern GDBM_FILE gdbm_open (const char *, int, int, int, void (*)(const char *)); extern void gdbm_close (GDBM_FILE); @@ -116,6 +119,7 @@ extern int gdbm_delete (GDBM_FILE, datum); extern datum gdbm_firstkey (GDBM_FILE); extern datum gdbm_nextkey (GDBM_FILE, datum); extern int gdbm_reorganize (GDBM_FILE); + extern void gdbm_sync (GDBM_FILE); extern int gdbm_exists (GDBM_FILE, datum); extern int gdbm_setopt (GDBM_FILE, int, void *, int); @@ -128,7 +132,39 @@ 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); + +typedef struct gdbm_recovery_s +{ + /* Input members. + These are initialized before call to gdbm_recover. The flags argument + specifies which of them are initialized. */ + void (*errfun) (void *data, char const *fmt, ...); + void *data; + + size_t max_failed_keys; + size_t max_failed_buckets; + size_t max_failures; + + /* Output members. + The gdbm_recover function fills these before returning. */ + size_t recovered_keys; + size_t recovered_buckets; + size_t failed_keys; + size_t failed_buckets; + char *backup_name; +} gdbm_recovery; + +#define GDBM_RCVR_DEFAULT 0x00 /* Default settings */ +#define GDBM_RCVR_ERRFUN 0x01 /* errfun is initialized */ +#define GDBM_RCVR_MAX_FAILED_KEYS 0x02 /* max_failed_keys is initialized */ +#define GDBM_RCVR_MAX_FAILED_BUCKETS 0x04 /* max_failed_buckets is initialized */ +#define GDBM_RCVR_MAX_FAILURES 0x08 /* max_failures is initialized */ +#define GDBM_RCVR_BACKUP 0x10 /* Keep backup copy of the + original database on success */ +extern int gdbm_recover (GDBM_FILE dbf, gdbm_recovery *rcvr, int flags); + + #define GDBM_DUMP_FMT_BINARY 0 #define GDBM_DUMP_FMT_ASCII 1 @@ -146,6 +182,8 @@ extern int gdbm_load_from_file (GDBM_FILE *, FILE *, int replace, int meta_flags, unsigned long *line); +extern int gdbm_copy_meta (GDBM_FILE dst, GDBM_FILE src); + # define GDBM_NO_ERROR 0 # define GDBM_MALLOC_ERROR 1 # define GDBM_BLOCK_SIZE_ERROR 2 @@ -176,15 +214,18 @@ extern int gdbm_load_from_file (GDBM_FILE *, FILE *, int replace, # define GDBM_ERR_FILE_OWNER 27 # define GDBM_ERR_FILE_MODE 28 # define GDBM_NEED_RECOVERY 29 +# define GDBM_BACKUP_FAILED 30 -# define _GDBM_MIN_ERRNO 0 -# define _GDBM_MAX_ERRNO GDBM_NEED_RECOVERY +# define _GDBM_MIN_ERRNO 0 +# define _GDBM_MAX_ERRNO GDBM_BACKUP_FAILED typedef int gdbm_error; /* For compatibilities sake. */ extern gdbm_error gdbm_errno; extern const char * const gdbm_errlist[]; - +extern int const gdbm_syserr[]; + extern int gdbm_last_errno (GDBM_FILE dbf); +extern int gdbm_last_syserr (GDBM_FILE dbf); extern void gdbm_set_errno (GDBM_FILE dbf, gdbm_error ec, int fatal); extern void gdbm_clear_error (GDBM_FILE dbf); extern int gdbm_needs_recovery (GDBM_FILE dbf); @@ -192,6 +233,8 @@ extern int gdbm_needs_recovery (GDBM_FILE dbf); /* extra prototypes */ extern const char *gdbm_strerror (gdbm_error); +extern const char *gdbm_db_strerror (GDBM_FILE dbf); + extern int gdbm_version_cmp (int const a[], int const b[]); # if defined(__cplusplus) || defined(c_plusplus) |