* 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.
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)
}
}
-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)
{
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++;
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));
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;
{
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
limiter.name = "Bucket";
limiter.pos = 0;
limiter.refill = obuck_slurp_refill;
+ limiter.can_overwrite_buffer = obuck_rpf->can_overwrite_buffer;
return &limiter;
}