aboutsummaryrefslogtreecommitdiff
path: root/src/bucket.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2013-05-21 20:43:02 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2013-05-21 20:43:02 +0000
commit05fa76dfce5311161abbc64c12acbaf56f298e97 (patch)
tree00c6651278ded58dc53fdf1d50e601c2d469090a /src/bucket.c
parent7a87cd8c3ca9528bf53cdb06dfb4168450251d79 (diff)
downloadgdbm-05fa76dfce5311161abbc64c12acbaf56f298e97.tar.gz
gdbm-05fa76dfce5311161abbc64c12acbaf56f298e97.tar.bz2
New function gdbm_count.
* configure.ac: Check for unsigned long long, define substitution variable GDBM_COUNT_T. * src/gdbmcount.c: New file. * src/Makefile.am (libgdbm_la_SOURCES): Add gdbmcount.c. * src/bucket.c (_gdbm_read_bucket_at): New function. * src/gdbm.h.in (gdbm_count_t): New typedef. (gdbm_count): New proto. * src/gdbmdefs.h (GDBM_DIR_COUNT): New define. * src/proto.h (_gdbm_read_bucket_at): New proto. * src/var.c: New variable "filemode". * src/gdbmtool.c: Use gdbm_count. Various bugfixes. * NEWS: Update. * doc/gdbm.texinfo: Update.
Diffstat (limited to 'src/bucket.c')
-rw-r--r--src/bucket.c43
1 files changed, 39 insertions, 4 deletions
diff --git a/src/bucket.c b/src/bucket.c
index 0c87759..0934d16 100644
--- a/src/bucket.c
+++ b/src/bucket.c
@@ -104,6 +104,44 @@ _gdbm_get_bucket (GDBM_FILE dbf, int dir_index)
return;
}
+int
+_gdbm_read_bucket_at (GDBM_FILE dbf, off_t off, hash_bucket *bucket,
+ size_t size)
+{
+ off_t file_pos;
+ int i, rc;
+
+ if (dbf->cache_entry && dbf->cache_entry->ca_adr == off)
+ {
+ memcpy (bucket, dbf->bucket, size);
+ return 0;
+ }
+
+ /* Look in the cache. */
+ for (i = 0; i < dbf->cache_size; i++)
+ {
+ if (dbf->bucket_cache[i].ca_adr == off)
+ {
+ memcpy (bucket, dbf->bucket_cache[i].ca_bucket, size);
+ return 0;
+ }
+ }
+
+ /* Read the bucket. */
+ file_pos = __lseek (dbf, off, SEEK_SET);
+ if (file_pos != off)
+ {
+ gdbm_errno = GDBM_FILE_SEEK_ERROR;
+ return -1;
+ }
+ rc = _gdbm_full_read (dbf, bucket, size);
+ if (rc)
+ {
+ gdbm_errno = rc;
+ return -1;
+ }
+ return 0;
+}
/* Split the current bucket. This includes moving all items in the bucket to
a new bucket. This doesn't require any disk reads because all hash values
@@ -177,8 +215,6 @@ _gdbm_split_bucket (GDBM_FILE dbf, int next_insert)
adr_1 = _gdbm_alloc (dbf, dbf->header->bucket_size);
dbf->bucket_cache[cache_1].ca_adr = adr_1;
-
-
/* Double the directory size if necessary. */
if (dbf->header->dir_bits == dbf->bucket->bucket_bits)
{
@@ -186,8 +222,7 @@ _gdbm_split_bucket (GDBM_FILE dbf, int next_insert)
dir_adr = _gdbm_alloc (dbf, dir_size);
new_dir = (off_t *) malloc (dir_size);
if (new_dir == NULL) _gdbm_fatal (dbf, _("malloc error"));
- for (index = 0;
- index < dbf->header->dir_size/sizeof (off_t); index++)
+ for (index = 0; index < GDBM_DIR_COUNT (dbf); index++)
{
new_dir[2*index] = dbf->dir[index];
new_dir[2*index+1] = dbf->dir[index];

Return to:

Send suggestions and report system problems to the System administrator.