aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bucket.c10
-rw-r--r--src/gdbm.h.in91
-rw-r--r--src/gdbmclose.c3
-rw-r--r--src/gdbmconst.h2
-rw-r--r--src/gdbmdefs.h0
-rw-r--r--src/gdbmopen.c5
6 files changed, 61 insertions, 50 deletions
diff --git a/src/bucket.c b/src/bucket.c
index 90734a1..dd72954 100644
--- a/src/bucket.c
+++ b/src/bucket.c
@@ -205,7 +205,9 @@ cache_lookup (GDBM_FILE dbf, off_t adr, cache_elem *ref, cache_elem **ret_elem)
elem->ca_node = node;
node->elem = elem;
- if (dbf->cache_num > dbf->cache_size && cache_lru_free (dbf))
+ if (dbf->cache_size != GDBM_CACHE_AUTO
+ && dbf->cache_num > dbf->cache_size
+ && cache_lru_free (dbf))
{
cache_elem_free (dbf, elem);
return node_failure;
@@ -573,12 +575,11 @@ _gdbm_write_bucket (GDBM_FILE dbf, cache_elem *ca_entry)
int
_gdbm_cache_init (GDBM_FILE dbf, size_t size)
{
- if (size == 0)
- size = 1;
-
if (size == dbf->cache_size)
return 0;
+ if (size != GDBM_CACHE_AUTO)
+ {
while (size < dbf->cache_num)
{
/* Flush the least recently used element */
@@ -590,6 +591,7 @@ _gdbm_cache_init (GDBM_FILE dbf, size_t size)
}
cache_elem_free (dbf, elem);
}
+ }
dbf->cache_size = size;
diff --git a/src/gdbm.h.in b/src/gdbm.h.in
index 9b2fd95..abceba1 100644
--- a/src/gdbm.h.in
+++ b/src/gdbm.h.in
@@ -53,6 +53,7 @@ extern "C" {
GDBM_BLOCK_SIZE_ERROR error if unable to
set it. */
# define GDBM_CLOERROR 0x400 /* Only for gdbm_fd_open: close fd on error. */
+# define GDBM_XVERIFY 0x800 /* Additional consistency checks. */
/* Parameters to gdbm_store for simple insertion or replacement in the
case that the key is already in the database. */
@@ -84,6 +85,8 @@ extern "C" {
# define GDBM_GETDBNAME 15 /* Return database file name */
# define GDBM_GETBLOCKSIZE 16 /* Return block size */
+# define GDBM_CACHE_AUTO 0
+
typedef @GDBM_COUNT_T@ gdbm_count_t;
/* The data and key structure. */
@@ -93,7 +96,6 @@ typedef struct
int dsize;
} datum;
-
/* A pointer to the GDBM file. */
typedef struct gdbm_file_info *GDBM_FILE;
@@ -191,48 +193,51 @@ extern int gdbm_load_from_file (GDBM_FILE *, FILE *, int replace,
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
-# define GDBM_FILE_OPEN_ERROR 3
-# define GDBM_FILE_WRITE_ERROR 4
-# define GDBM_FILE_SEEK_ERROR 5
-# define GDBM_FILE_READ_ERROR 6
-# define GDBM_BAD_MAGIC_NUMBER 7
-# define GDBM_EMPTY_DATABASE 8
-# define GDBM_CANT_BE_READER 9
-# define GDBM_CANT_BE_WRITER 10
-# define GDBM_READER_CANT_DELETE 11
-# define GDBM_READER_CANT_STORE 12
-# define GDBM_READER_CANT_REORGANIZE 13
-# define GDBM_UNKNOWN_ERROR 14
-# define GDBM_ITEM_NOT_FOUND 15
-# define GDBM_REORGANIZE_FAILED 16
-# define GDBM_CANNOT_REPLACE 17
-# define GDBM_ILLEGAL_DATA 18
-# define GDBM_OPT_ALREADY_SET 19
-# define GDBM_OPT_ILLEGAL 20
-# define GDBM_BYTE_SWAPPED 21
-# define GDBM_BAD_FILE_OFFSET 22
-# define GDBM_BAD_OPEN_FLAGS 23
-# define GDBM_FILE_STAT_ERROR 24
-# define GDBM_FILE_EOF 25
-# define GDBM_NO_DBNAME 26
-# define GDBM_ERR_FILE_OWNER 27
-# define GDBM_ERR_FILE_MODE 28
-# define GDBM_NEED_RECOVERY 29
-# define GDBM_BACKUP_FAILED 30
-# define GDBM_DIR_OVERFLOW 31
-# define GDBM_BAD_BUCKET 32
-# define GDBM_BAD_HEADER 33
-# define GDBM_BAD_AVAIL 34
-# define GDBM_BAD_HASH_TABLE 35
-# define GDBM_BAD_DIR_ENTRY 36
-# define GDBM_FILE_CLOSE_ERROR 37
-# define GDBM_FILE_SYNC_ERROR 38
-# define GDBM_FILE_TRUNCATE_ERROR 39
-# define GDBM_BUCKET_CACHE_CORRUPTED 40
-# define GDBM_BAD_HASH_ENTRY 40
+enum
+ {
+ GDBM_NO_ERROR = 0,
+ GDBM_MALLOC_ERROR = 1,
+ GDBM_BLOCK_SIZE_ERROR = 2,
+ GDBM_FILE_OPEN_ERROR = 3,
+ GDBM_FILE_WRITE_ERROR = 4,
+ GDBM_FILE_SEEK_ERROR = 5,
+ GDBM_FILE_READ_ERROR = 6,
+ GDBM_BAD_MAGIC_NUMBER = 7,
+ GDBM_EMPTY_DATABASE = 8,
+ GDBM_CANT_BE_READER = 9,
+ GDBM_CANT_BE_WRITER = 10,
+ GDBM_READER_CANT_DELETE = 11,
+ GDBM_READER_CANT_STORE = 12,
+ GDBM_READER_CANT_REORGANIZE = 13,
+ GDBM_UNKNOWN_ERROR = 14,
+ GDBM_ITEM_NOT_FOUND = 15,
+ GDBM_REORGANIZE_FAILED = 16,
+ GDBM_CANNOT_REPLACE = 17,
+ GDBM_ILLEGAL_DATA = 18,
+ GDBM_OPT_ALREADY_SET = 19,
+ GDBM_OPT_ILLEGAL = 20,
+ GDBM_BYTE_SWAPPED = 21,
+ GDBM_BAD_FILE_OFFSET = 22,
+ GDBM_BAD_OPEN_FLAGS = 23,
+ GDBM_FILE_STAT_ERROR = 24,
+ GDBM_FILE_EOF = 25,
+ GDBM_NO_DBNAME = 26,
+ GDBM_ERR_FILE_OWNER = 27,
+ GDBM_ERR_FILE_MODE = 28,
+ GDBM_NEED_RECOVERY = 29,
+ GDBM_BACKUP_FAILED = 30,
+ GDBM_DIR_OVERFLOW = 31,
+ GDBM_BAD_BUCKET = 32,
+ GDBM_BAD_HEADER = 33,
+ GDBM_BAD_AVAIL = 34,
+ GDBM_BAD_HASH_TABLE = 35,
+ GDBM_BAD_DIR_ENTRY = 36,
+ GDBM_FILE_CLOSE_ERROR = 37,
+ GDBM_FILE_SYNC_ERROR = 38,
+ GDBM_FILE_TRUNCATE_ERROR = 39,
+ GDBM_BUCKET_CACHE_CORRUPTED = 40,
+ GDBM_BAD_HASH_ENTRY = 41,
+ };
# define _GDBM_MIN_ERRNO 0
# define _GDBM_MAX_ERRNO GDBM_BAD_HASH_ENTRY
diff --git a/src/gdbmclose.c b/src/gdbmclose.c
index f2bce02..c9e3749 100644
--- a/src/gdbmclose.c
+++ b/src/gdbmclose.c
@@ -22,8 +22,7 @@
#include "gdbmdefs.h"
/* Close the dbm file and free all memory associated with the file DBF.
- Before freeing members of DBF, check and make sure that they were
- allocated. */
+ */
int
gdbm_close (GDBM_FILE dbf)
diff --git a/src/gdbmconst.h b/src/gdbmconst.h
index feae7f8..d466ac5 100644
--- a/src/gdbmconst.h
+++ b/src/gdbmconst.h
@@ -51,7 +51,7 @@
#define BUCKET_AVAIL 6
/* The size of the bucket cache. */
-#define DEFAULT_CACHESIZE 100
+#define DEFAULT_CACHESIZE GDBM_CACHE_AUTO
#ifndef SIZE_T_MAX
/* Maximum size representable by a size_t variable */
diff --git a/src/gdbmdefs.h b/src/gdbmdefs.h
index e61f36e..c6df13d 100644
--- a/src/gdbmdefs.h
+++ b/src/gdbmdefs.h
diff --git a/src/gdbmopen.c b/src/gdbmopen.c
index 440acfc..cb7950b 100644
--- a/src/gdbmopen.c
+++ b/src/gdbmopen.c
@@ -578,6 +578,11 @@ gdbm_fd_open (int fd, const char *file_name, int block_size,
dbf->bucket_changed = FALSE;
dbf->second_changed = FALSE;
+ if (flags & GDBM_XVERIFY)
+ {
+ gdbm_avail_verify (dbf);
+ }
+
GDBM_DEBUG (GDBM_DEBUG_ALL, "%s: opened %s", dbf->name,
dbf->need_recovery ? "for recovery" : "successfully");

Return to:

Send suggestions and report system problems to the System administrator.