aboutsummaryrefslogtreecommitdiff
path: root/src/gdbm.h.in
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2016-07-19 12:01:48 +0300
committerSergey Poznyakoff <gray@gnu.org>2016-07-19 12:58:16 +0300
commit85f1e72da83e3078e2ae1f78093ef0966e43cec1 (patch)
treeb00707979e9088d5f7b7880d438260eb063c9160 /src/gdbm.h.in
parent8e83f209342e2b035bbb19efa87ec5295158ef65 (diff)
downloadgdbm-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.in49
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)

Return to:

Send suggestions and report system problems to the System administrator.