
www.Usenet.com
| <-- __Chronological__ --> | <-- __Thread__ --> |
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__ --> |