mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.6 KiB
93 lines
2.6 KiB
//============== DAE: OS/2 Database Access Engine ===================
|
|
//============== SCB: Sort Control Block ===================
|
|
|
|
#ifndef FCB_INCLUDED
|
|
#error scb.h requires fcb.h
|
|
#endif /* FCB_INCLUDED */
|
|
|
|
#ifdef SCB_INCLUDED
|
|
#error scb.h already included
|
|
#endif /* SCB_INCLUDED */
|
|
#define SCB_INCLUDED
|
|
|
|
typedef ULONG RID, *PRID;
|
|
|
|
typedef struct
|
|
{
|
|
PN pn;
|
|
UINT cbfRun;
|
|
} RUN, *PRUN;
|
|
|
|
/* choose crunMost so that crunMost % crunMergeMost = crunMergeMost - 1
|
|
/**/
|
|
|
|
#define crunMergeMost 16 // max number of runs to be merged
|
|
#define crunMost 31 // size of run directory
|
|
|
|
#define fSCBInsert (1<<0)
|
|
#define fSCBIndex (1<<1)
|
|
#define fSCBUnique (1<<2)
|
|
|
|
#define SCBSetInsert( pscb ) ((pscb)->fFlags |= fSCBInsert )
|
|
#define SCBResetInsert( pscb ) ((pscb)->fFlags &= ~fSCBInsert )
|
|
#define FSCBInsert( pscb ) ((pscb)->fFlags & fSCBInsert )
|
|
|
|
#define SCBSetIndex( pscb ) ((pscb)->fFlags |= fSCBIndex )
|
|
#define SCBResetIndex( pscb ) ((pscb)->fFlags &= ~fSCBIndex )
|
|
#define FSCBIndex( pscb ) ((pscb)->fFlags & fSCBIndex )
|
|
|
|
#define SCBSetUnique( pscb ) ((pscb)->fFlags |= fSCBUnique )
|
|
#define SCBResetUnique( pscb ) ((pscb)->fFlags &= ~fSCBUnique )
|
|
#define FSCBUnique( pscb ) ((pscb)->fFlags & fSCBUnique )
|
|
|
|
struct _scb
|
|
{
|
|
struct _fcb fcb; // MUST BE FIRST FIELD IN STRUCTURE
|
|
JET_GRBIT grbit; // sort grbit
|
|
INT fFlags; // sort flags
|
|
|
|
// in-memory related
|
|
LONG cbSort; // size of sort buffer
|
|
#ifdef WIN16
|
|
HANDLE hrgbSort; // handle for sort buffer
|
|
#endif /* WIN16 */
|
|
BYTE *rgbSort; // sort buffer
|
|
BYTE *pbEnd; // end of last inserted record
|
|
BYTE **rgpb; // beginning of array of pointers
|
|
BYTE **ppbMax; // end of array of pointers
|
|
LONG wRecords; // count of records in sort buffer
|
|
|
|
// disk related
|
|
BYTE *rgpbMerge[crunMost];
|
|
struct _bf *rgpbf[crunMergeMost];
|
|
struct _bf *pbfOut; // output buffer
|
|
BYTE *pbOut; // current pos in output buffer
|
|
BYTE *pbMax; // end of output buffer (could be computed)
|
|
RUN rgrun[crunMost]; // run directory
|
|
INT crun;
|
|
INT bf; // input buffers
|
|
INT cpbMerge; // merge tree
|
|
|
|
#ifdef DEBUG
|
|
LONG cbfPin;
|
|
LONG lInput;
|
|
LONG lOutput;
|
|
#endif
|
|
};
|
|
|
|
#ifdef DEBUG
|
|
#define SCBPin( pscb ) ( (pscb)->cbfPin++ )
|
|
#define SCBUnpin( pscb ) { Assert( (pscb)->cbfPin > 0 ); (pscb)->cbfPin--; }
|
|
#else
|
|
#define SCBPin( pscb )
|
|
#define SCBUnpin( pscb )
|
|
#endif
|
|
|
|
#define PscbMEMAlloc() (SCB*)PbMEMAlloc(iresSCB)
|
|
|
|
#ifdef DEBUG /* Debug check for illegal use of freed scb */
|
|
#define MEMReleasePscb(pscb) { MEMRelease(iresSCB, (BYTE*)(pscb)); pscb = pscbNil; }
|
|
#else
|
|
#define MEMReleasePscb(pscb) { MEMRelease(iresSCB, (BYTE*)(pscb)); }
|
|
#endif
|
|
|