]> mj.ucw.cz Git - libucw.git/blobdiff - lib/bucket.c
`buckettool -c' (cat) now separates buckets by an empty line.
[libucw.git] / lib / bucket.c
index 38836e80a5f28394f841410fc86a98a0aef641c1..f81f03e8d3f5444d0af9d3176edf932f0fe1b5a3 100644 (file)
@@ -2,6 +2,7 @@
  *     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.
@@ -153,9 +154,10 @@ obuck_fb_refill(struct fastbuf *f)
   uns remains, bufsize, size, datasize;
 
   remains = FB_BUCKET(f)->bucket_size - (uns)f->pos;
-  bufsize = f->bufend - f->buffer;
   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)
@@ -317,6 +319,7 @@ obuck_fetch(void)
   b->seek = NULL;
   b->close = obuck_fb_close;
   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++;
@@ -356,6 +359,7 @@ obuck_create(u32 type)
   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));
@@ -403,14 +407,15 @@ static sh_off_t slurp_start, slurp_current, slurp_end;
 static int
 obuck_slurp_refill(struct fastbuf *f)
 {
-  uns l;
-
   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);
+  /* 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;
@@ -430,9 +435,7 @@ obuck_slurp_pool(struct obuck_header *hdrp)
        {
          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
@@ -467,6 +470,7 @@ obuck_slurp_pool(struct obuck_header *hdrp)
   limiter.name = "Bucket";
   limiter.pos = 0;
   limiter.refill = obuck_slurp_refill;
+  limiter.can_overwrite_buffer = obuck_rpf->can_overwrite_buffer;
   return &limiter;
 }