Hi All,

I've never needed to use stream blobs before, but now I have a
class where I wanted to implement isc_seek_blob and thought
I should do some research first ... and now I'm confused.

This article surprised me by suggesting that stream blobs and
segmented blobs were stored differently:
http://www.ibphoenix.com/resources/documents/search/doc_112

I always thought that blobs were blobs, and that the stream
interface API was just another way to access them.  Indeed when
I look at jrd/utl.cpp (v2.5.1 source) and the implementation of
Bopen that is exactly what I find.  There are no special bpb
parameters being passed when calling isc_create_blob2 or
isc_open_blob2, and the get/put functions just call get_segment
and put_segment.  Yippee! I thought, this sounds easy.

But further research indicates that isc_seek_blob will
apparently only work with explicitly stream blobs, and inside
jrd/blb.cpp I find that there is indeed a flag associated with
each blob indicating whether it's streamed or segmented.  So it
begins to look like isc_seek_blob may or may not work depending
on circumstances I haven't been able to work out.

This all leads to questions:

  . Do I need to care about the distinction between stream
    and segment blobs in all my existing code that just uses
    get_segment and put_segment calls?  (I'm guessing no,
    since that seems to be all that happens beneath everything
    anyway, but I don't want nasty surprises if I start
    creating stream blobs in databases where only segment
    blobs existed in the past.)

  . More particularly, if I want to use the isc_seek_blob API
    do I need to _create_ a blob a using isc_bpb_type_stream,
    or is this happening automatically for me somewhere in
    the background?

  . Can I obtain an explicitly stream blob by opening an
    existing (possibly segmented) blob with isc_bpb_type_stream?
    Or will this give me strange results with offsets referring
    to segments rather than the entire blob - one post I saw in
    the archives suggested something like this.

  . If blobs don't default to stream type, then isn't it very
    strange that Bopen doesn't actually create stream blobs?
    ie. Look at the link above and note that it indicates that
    isc_seek_blob can be used with the handle available in the
    BSTREAM structure (which seems logical).

  . If blobs don't default to stream type then this would also
    seem to mean that wanting to use isc_seek_blob on an
    existing database will mean some sort of special upgrade
    process where all blobs are recreated as stream blobs.
    (And this begins to make isc_seek_blob something to be
    left alone.)

Can anyone enlighten me as to what is going on here?

-- 
Geoff Worboys
Telesis Computing Pty Ltd

Reply via email to