Usenet.com

www.Usenet.com

Group Index

Comp Thread Archive from Usenet.com

<-- __Chronological__ --> <-- __Thread__ -->

Re: BLOB + BTRIEVE = ?



Dave,
Is this "maximum" limit restricted to Btrieve,
or is this a common to all Databases ?

Using files on disk is handy, but when using IDS it is not handy anymore...

GTi


"David Reed" <[EMAIL PROTECTED]> wrote in message
news:[EMAIL PROTECTED]
> You're correct about the maximum.
>
> Funny you mention pictures.
>
> I was faced with a similar situation earlier this year.  I ended up just
> storing a path to an external file containing the picture.  Once I hit the
> record I wanted, I'd just open the file at that location, which was a file
> in the folder I was in.
>
> ...dave
>
>
> "GTi" <[EMAIL PROTECTED]> wrote in message
> news:[EMAIL PROTECTED]
> > Thanks David,
> >
> > In your case you have a maximum length of 4000 bytes in the comment
> field -
> > right?
> > And what if the comment fields is over 4000 bytes. What happens then?
> >
> > > comment          LVAR(4000))
> > As I can see it, you MUST set a maximum length to something. If it is
> 4000,
> > 10000
> > or 400000 it MUST be a value. Is that correct?
> >
> > Today I store the files on the disk, and the filename is the key value
of
> my
> > record.
> > That gives me no limits on the file size. But it should be in the
> database.
> > Say - For some years ago a digital camera was producing pictures of 1-2
> MB.
> > Today it have 5-6 MB.
> > If I limited this to 3 MB for some years ago, I have been lost today.
> > So if I go for this I must set a limit for the records to 100 MB - say
200
> > MB to be
> > sure if I can still use it in the future (not limited to pictures).
> > Or ?
> >
> >
> >
> > "David Reed" <[EMAIL PROTECTED]> wrote in message
> > news:[EMAIL PROTECTED]
> > > The following code uses the Windows SDK GlobalAlloc.  Feel free to
> > > substitute the malloc of your choice.
> > >
> > > All my files were created via Novell's XQL, so I don't have code to
tell
> > you
> > > how to create it.  The XQL statement was:
> > >
> > > create table TABLE using "TABLE .DAT" DCOMPRESS pagesize 4096
> > >      (recordID             INT(4),
> > >       code                 CHAR(8),
> > >       reserved             CHAR(16),
> > >       flags                INT(4),
> > >       commentText          LVAR(4000))
> > >            with index (recordID UNIQUE,
> > >                        code UNIQUE MOD)
> > >
> > > Here's how I access it in the code:
> > >
> > > Ok, start with a structure for the fixed portion of the record:
> > >
> > > //
> > > //  Table Structure
> > > //  Record length: Variable: Fixed portion = 32
> > > //  Defined flags: None
> > > //
> > > //  Record Layout:  Bytes  Description
> > > //                  ~~~~~  ~~~~~~~~~~~
> > > //                   1-4   Record ID
> > > //                   5-12  Code
> > > //                  13-28  Reserved
> > > //                  29-32  Record Flags
> > > //                  33-4032 Text (variable)
> > > //
> > > #define CODE_LENGTH           8
> > > #define RESERVED_LENGTH      16
> > > #define FIXED_LENGTH         32
> > > #define VARIABLE_LENGTH    4000
> > > #define TOTAL_LENGTH FIXED_LENGTH + VARIABLE_LENGTH
> > >
> > > typedef struct TABLEStruct
> > > {
> > >   long recordID;
> > >   char code[CODE_LENGTH];
> > >   char reserved[RESERVED_LENGTH];
> > >   long flags;
> > > } TABLEDef;
> > >
> > > typedef struct TABLEKey0Struct
> > > {
> > >   long recordID;
> > > } TABLEKey0Def;
> > >
> > > typedef struct TABLEKey1Struct
> > > {
> > >   char code[COMMENTS_CODE_LENGTH];
> > > } TABLEKey1Def;
> > >
> > > EXTERN TABLEDef     TABLE;
> > > EXTERN TABLEKey1Def TABLEKey1;
> > > EXTERN HANDLE hMemTableText;
> > > EXTERN char *pTableText;
> > >
> > >
> > > * * * *
> > >
> > > You can do the following in the main routine:
> > >
> > > //
> > > //  Allocate space for the text portion of the table
> > > //
> > >   hMemTableText = GlobalAlloc(GPTR, TOTAL_LENGTH);
> > >   pTableText = (char *)hMemTableText;
> > >   if(hMemCommentText == NULL || pCommentText == NULL)
> > >   {
> > >     /* Error */
> > >   }
> > >
> > > * * * * *
> > >
> > > In the routine you use to access all of the variable length file:
> > >
> > > char code[] = "SomeText";
> > >
> > > strcpy(TABLE.code, code);
> > >
> > > dataBufferLength = TOTAL_LENGTH;
> > > rcode = BTRVID((BTI_WORD)GETEQUAL, positionBlock, pTableText ,
> > > &dataBufferLength, TABLE.code, (BTI_SINT)1,
(BTI_BUFFER_PTR)&clientID);
> > >
> > > if(rcode == 0)
> > > {
> > >   memcpy(&TABLE, pTableText, FIXED_LENGTH);
> > >   /* Variable portion starts at pTableText[FIXED_LENGTH] */
> > > }
> > >
> > > * * * * *
> > > If you're just cycling through, set the data buffer length to
> FIXED_LENGTH
> > > and pass the data structure instead of pTable Text.  You'll get rcode
==
> > 22,
> > > but you won't have the overhead of getting (potentially) a bunch of
> > > additional data for records you may end up skipping.
> > >
> > > *******
> > >
> > > Bill Bach, if you're reading, is there much overhead savings in this?
> > >
> > >
> > > Anyway, hope this helps.
> > >
> > > David Reed
> > > Schedule Masters, Inc.
> > >
> > >
> >
> >
>
>





<-- __Chronological__ --> <-- __Thread__ -->


Usenet.com



Please check out one of the premium Usenet Newsgroup Service Providers below for access to Usenet.