Usenet.com

www.Usenet.com

Group Index

Comp Thread Archive from Usenet.com

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

Re: BLOB + BTRIEVE = ?



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.