]> mj.ucw.cz Git - libucw.git/blobdiff - lib/bucket.c
taken much faster implementation of Adler32 and put into a separate source-code
[libucw.git] / lib / bucket.c
index 2b7dc27a2e69129fd8878181242421709f6563ba..f81f03e8d3f5444d0af9d3176edf932f0fe1b5a3 100644 (file)
@@ -2,6 +2,7 @@
  *     Sherlock Library -- Object Buckets
  *
  *     (c) 2001--2004 Martin Mares <mj@ucw.cz>
  *     Sherlock Library -- Object Buckets
  *
  *     (c) 2001--2004 Martin Mares <mj@ucw.cz>
+ *     (c) 2004 Robert Spalek <robert@ucw.cz>
  *
  *     This software may be freely distributed and used according to the terms
  *     of the GNU Lesser General Public License.
  *
  *     This software may be freely distributed and used according to the terms
  *     of the GNU Lesser General Public License.
@@ -153,9 +154,10 @@ obuck_fb_refill(struct fastbuf *f)
   uns remains, bufsize, size, datasize;
 
   remains = FB_BUCKET(f)->bucket_size - (uns)f->pos;
   uns remains, bufsize, size, datasize;
 
   remains = FB_BUCKET(f)->bucket_size - (uns)f->pos;
-  bufsize = f->bufend - f->buffer;
   if (!remains)
     return 0;
   if (!remains)
     return 0;
+  f->buffer = FB_BUCKET(f)->buffer;    /* Could have been trimmed by bdirect_read_commit_modified() */
+  bufsize = f->bufend - f->buffer;
   sh_off_t start = FB_BUCKET(f)->start_pos;
   sh_off_t pos = start + sizeof(struct obuck_header) + f->pos;
   if (remains <= bufsize)
   sh_off_t start = FB_BUCKET(f)->start_pos;
   sh_off_t pos = start + sizeof(struct obuck_header) + f->pos;
   if (remains <= bufsize)
@@ -300,18 +302,6 @@ obuck_find_next(struct obuck_header *hdrp, int full)
     }
 }
 
     }
 }
 
-static int
-obuck_bconfig(struct fastbuf *f UNUSED, uns item, int value UNUSED)
-{
-  switch (item)
-    {
-    case BCONFIG_CAN_OVERWRITE:
-      return 2;
-    default:
-      return -1;
-    }
-}
-
 struct fastbuf *
 obuck_fetch(void)
 {
 struct fastbuf *
 obuck_fetch(void)
 {
@@ -328,7 +318,8 @@ obuck_fetch(void)
   b->spout = NULL;
   b->seek = NULL;
   b->close = obuck_fb_close;
   b->spout = NULL;
   b->seek = NULL;
   b->close = obuck_fb_close;
-  b->config = obuck_bconfig;
+  b->config = NULL;
+  b->can_overwrite_buffer = 2;
   FB_BUCKET(b)->start_pos = bucket_find_pos;
   FB_BUCKET(b)->bucket_size = obuck_hdr.length;
   obuck_fb_count++;
   FB_BUCKET(b)->start_pos = bucket_find_pos;
   FB_BUCKET(b)->bucket_size = obuck_hdr.length;
   obuck_fb_count++;
@@ -368,6 +359,7 @@ obuck_create(u32 type)
   b->seek = NULL;
   b->close = NULL;
   b->config = NULL;
   b->seek = NULL;
   b->close = NULL;
   b->config = NULL;
+  b->can_overwrite_buffer = 0;
   FB_BUCKET(b)->start_pos = start;
   FB_BUCKET(b)->bucket_size = 0;
   bwrite(b, &obuck_create_hdr, sizeof(obuck_create_hdr));
   FB_BUCKET(b)->start_pos = start;
   FB_BUCKET(b)->bucket_size = 0;
   bwrite(b, &obuck_create_hdr, sizeof(obuck_create_hdr));
@@ -415,14 +407,15 @@ static sh_off_t slurp_start, slurp_current, slurp_end;
 static int
 obuck_slurp_refill(struct fastbuf *f)
 {
 static int
 obuck_slurp_refill(struct fastbuf *f)
 {
-  uns l;
-
   if (!slurp_remains)
     return 0;
   if (!slurp_remains)
     return 0;
-  l = bdirect_read_prepare(obuck_rpf, &f->buffer);
+  uns l = bdirect_read_prepare(obuck_rpf, &f->buffer);
   if (!l)
     obuck_broken("Incomplete object", slurp_start);
   l = MIN(l, slurp_remains);
   if (!l)
     obuck_broken("Incomplete object", slurp_start);
   l = MIN(l, slurp_remains);
+  /* XXX: This probably should be bdirect_read_commit_modified() in some cases,
+   *      but it doesn't hurt since we aren't going to seek.
+   */
   bdirect_read_commit(obuck_rpf, f->buffer + l);
   slurp_remains -= l;
   f->bptr = f->buffer;
   bdirect_read_commit(obuck_rpf, f->buffer + l);
   slurp_remains -= l;
   f->bptr = f->buffer;
@@ -442,9 +435,7 @@ obuck_slurp_pool(struct obuck_header *hdrp)
        {
          obuck_lock_read();
          obuck_rpf = bopen(obuck_name, O_RDONLY, obuck_slurp_buflen);
        {
          obuck_lock_read();
          obuck_rpf = bopen(obuck_name, O_RDONLY, obuck_slurp_buflen);
-         bseek(obuck_rpf, 0, SEEK_END);
-         slurp_end = btell(obuck_rpf);
-         bsetpos(obuck_rpf, 0);
+         slurp_end = bfilesize(obuck_rpf);
          obuck_lock_read_to_scan();
        }
       else
          obuck_lock_read_to_scan();
        }
       else
@@ -479,6 +470,7 @@ obuck_slurp_pool(struct obuck_header *hdrp)
   limiter.name = "Bucket";
   limiter.pos = 0;
   limiter.refill = obuck_slurp_refill;
   limiter.name = "Bucket";
   limiter.pos = 0;
   limiter.refill = obuck_slurp_refill;
+  limiter.can_overwrite_buffer = obuck_rpf->can_overwrite_buffer;
   return &limiter;
 }
 
   return &limiter;
 }