Usenet.com

www.Usenet.com

Group Index

Comp Thread Archive from Usenet.com

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

Re: BLOB + BTRIEVE = ?



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.