campo-sirio/cb/source/r4relate.h

282 lines
8.8 KiB
C
Raw Normal View History

/* r4relate.h (c)Copyright Sequiter Software Inc., 1988-1996. All rights reserved. */
#define relate4filterRecord 101
#define relate4doRemove 102
#define relate4skipped 104
#define relate4blank 105
#define relate4skipRec 106
#define relate4terminate 107
#define relate4exact 108
#define relate4scan 109
#define relate4approx 110
#define relate4sortSkip 120
#define relate4sortDone 121
#define relate4continue 200
/* backward compatibility redefinitions */
#define relate4skip_rec relate4skipRec
struct DATA4LISTSt ;
struct RELATE4St ;
struct RELATION4St ;
typedef struct
{
struct DATA4LISTSt *relateDataList ;
TAG4FILE S4PTR *tag ; /* The tag whose expression could replace the sub-expression */
} E4INFO_REPORT ;
typedef struct
{
EXPR4 S4PTR *expr ;
E4INFO_REPORT S4PTR *infoReport ; /* One per E4INFO entry */
struct RELATION4St S4PTR *relation ;
CODE4 S4PTR *codeBase ;
char S4PTR *buf ;
unsigned bufPos, bufLen ;
} L4LOGICAL ;
typedef struct DATA4LISTSt
{
struct RELATE4St S4PTR * S4PTR *pointers ;
unsigned memAllocated ;
int pointersTot ;
int pointersUsed ;
} DATA4LIST ;
typedef struct RELATE4St
{
LINK4 link ;
S4CONV( int relationType, int relation_type ) ; /* relate4exact, relate4scan, relate4approx */
S4CONV( int sortType, int sort_type ) ;
S4CONV( int errorAction, int error_action ) ; /* relate4blank, relate4skipRec, relate4terminate */
S4CONV( int matchLen, int match_len ) ; /* Number of characters to match */
unsigned short int id ;
char S4PTR *scanValue ; /* Allocated Memory */
struct RELATE4St S4PTR *master ;
struct RELATION4St S4PTR *relation ;
S4CONV( CODE4 S4PTR *codeBase, CODE4 S4PTR *code_base ) ;
S4CONV( EXPR4 S4PTR *masterExpr, EXPR4 S4PTR *master_expr ) ; /* master expression */
S4CONV( TAG4 S4PTR *dataTag, TAG4 S4PTR *data_tag ) ; /* Null means record # lookup */
DATA4 S4PTR *data ; /* This is the master for 'slaves' (if any) and */
/* possibly the slave for another data file. */
LIST4 slaves ;
LIST4 relateList ; /* A list of scan Relate pointers; */
#ifndef S4CLIENT
int scanValueLen ;
int isRead ;
F4FLAG set ; /* Specify records for bitmap optimizable sub-expression. */
#ifndef S4STAND_ALONE
DATA4 S4PTR *dataOld ; /* the DATA4 that originally derived the relation */
int freeData ; /* did the relate create the data structure */
#endif
#endif
#ifdef S4SERVER
long dataId ; /* used for client identification purposes (locking) */
#else
S4CONV( char S4PTR *oldRecord, char S4PTR *old_record ) ;
#endif
#ifdef S4WINDOWS
HWND hWnd;
S4CONV( int totalChildren, int total_children ) ;
#endif
} RELATE4 ;
typedef struct
{
LINK4 link ;
RELATE4 S4PTR *ptr ;
} RELATE4LIST ;
typedef struct
{
LINK4 link ;
DATA4 S4PTR *data ;
RELATE4 S4PTR *relate ;
} R4DATA_LIST ;
typedef struct RELATION4St
{
LINK4 link ; /* for server version, the list of relations */
RELATE4 relate ;
S4CONV( char S4PTR *exprSource, char S4PTR *expr_source ) ;
char locked ;
S4CONV( char S4PTR *sortSource, char S4PTR *sort_source ) ;
char sortEofFlag ;
int bitmapDisable ; /* used for testing purposes to test disabled bitmaps */
#ifndef S4CLIENT
char inSort ; /* are we skipping for sorting purposes? */
LIST4 sortDataList ; /* data list for the sort */
L4LOGICAL log ;
char S4PTR *otherData, bitmapsFreed, sortDoneFlag ;
SORT4 sort ;
FILE4 sortedFile ;
int sortOtherLen ;
long sortRecTo, sortRecOn, sortFilePos, sortRecCount ;
#endif
int isInitialized ;
char skipBackwards ; /* is backwards skipping enabled? */
#ifdef S4CLIENT
int needsFreeing ;
#endif
unsigned long relationId ;
RELATE4 *currentRelateLevel ; /* current pos for scans */
#ifdef S4SERVER
LIST4 localDataList ;
unsigned short int relateIdCount ;
#endif
/* MEM4 S4PTR *relateMemory ; */
/* MEM4 S4PTR *relateListMemory ; */
/* MEM4 S4PTR *relateDataListMemory ; */
} RELATION4 ;
#define BITMAP4LEAF 0x40
#define BITMAP4AND 0x20
typedef struct CONST4St
{
LINK4 link ;
int offset ;
int len ;
} CONST4 ;
typedef struct BITMAP4St
{
LINK4 link ;
LINK4 eval ;
/* flags */
char branch ;
char andOr ; /* 1 = and, 2 = or, 0 means neither */
char evaluated ;
char finished;
char saveCount ;
char flipBase ;
char pureMap ;
char noMatch ; /* no records match an and case */
L4LOGICAL S4PTR *log ;
RELATE4 S4PTR *relate ;
struct BITMAP4St S4PTR *base ;
int type ; /* r4num, etc. */
/* Branch only */
LIST4 children ;
TAG4FILE S4PTR *tag ;
CONST4 lt ;
CONST4 le ;
CONST4 gt ;
CONST4 ge ;
CONST4 eq ;
LIST4 ne ;
} BITMAP4 ;
#ifdef __cplusplus
extern "C" {
#endif
/* exported functions */
S4EXPORT int S4FUNCTION relate4bottom( RELATE4 S4PTR * ) ;
S4EXPORT int S4FUNCTION relate4changed( RELATE4 S4PTR * ) ; /* Slave has been added or freed */
S4EXPORT RELATE4 S4PTR * S4FUNCTION relate4createSlave( RELATE4 S4PTR *, DATA4 S4PTR *, char S4PTR *, TAG4 S4PTR * ) ;
S4EXPORT int S4FUNCTION relate4doAll( RELATE4 S4PTR * ) ;
S4EXPORT int S4FUNCTION relate4doOne( RELATE4 S4PTR * ) ;
S4EXPORT int S4FUNCTION relate4eof( RELATE4 S4PTR * ) ;
S4EXPORT int S4FUNCTION relate4errorAction( RELATE4 S4PTR *, const int ) ; /* Set the error action */
S4EXPORT int S4FUNCTION relate4free( RELATE4 S4PTR *, const int ) ;
S4EXPORT RELATE4 S4PTR * S4FUNCTION relate4init( DATA4 S4PTR * ) ;
S4EXPORT int S4FUNCTION relate4matchLen( RELATE4 S4PTR *, const int ) ;
S4EXPORT int S4FUNCTION relate4next( RELATE4 S4PTR * S4PTR * ) ;
S4EXPORT int S4FUNCTION relate4querySet( RELATE4 S4PTR *, const char S4PTR * ) ;
S4EXPORT int S4FUNCTION relate4skip( RELATE4 S4PTR *, const long ) ; /* Extended record skip */
S4EXPORT int S4FUNCTION relate4skipEnable( RELATE4 S4PTR *, const int ) ;
S4EXPORT int S4FUNCTION relate4sortSet( RELATE4 S4PTR *, const char S4PTR * ) ;
S4EXPORT int S4FUNCTION relate4top( RELATE4 S4PTR * ) ;
S4EXPORT int S4FUNCTION relate4type( RELATE4 S4PTR *, int ) ; /* Set the relate type */
/* used by codeReporter */
S4EXPORT int S4FUNCTION relate4freeRelate( RELATE4 S4PTR *, const int ) ;
#ifdef S4CB51
S4EXPORT int S4FUNCTION relate4lock( RELATE4 S4PTR * ) ;
S4EXPORT int S4FUNCTION relate4unlock( RELATE4 S4PTR * ) ;
#else
#define relate4data( r4 ) ( (r4)->data )
#define relate4dataTag( r4 ) ( (r4)->dataTag )
#define relate4master( r4 ) ( (r4)->master )
#define relate4masterExpr( r4 ) ( ( (r4)->masterExpr == 0 ) ? ( 0 ) : ( (r4)->masterExpr->source ) )
#endif
#ifdef S4COMPILE_TEST
#ifndef S4OFF_MULTI
S4EXPORT int S4FUNCTION relate4lockAdd( RELATE4 S4PTR * ) ;
#endif
#else
S4EXPORT int S4FUNCTION relate4lockAdd( RELATE4 S4PTR * ) ;
#endif
S4EXPORT int S4FUNCTION relate4optimizeable( RELATE4 S4PTR * ) ;
/* internally used functions */
int bitmap4evaluate( L4LOGICAL *, const int ) ;
BITMAP4 * bitmap4redistribute( BITMAP4 *, BITMAP4 *, const char ) ;
BITMAP4 * bitmap4redistributeLeaf( BITMAP4 *, BITMAP4 *, BITMAP4 * ) ;
BITMAP4 * bitmap4redistributeBranch( BITMAP4 *, BITMAP4 * ) ;
BITMAP4 * bitmap4create( L4LOGICAL *, RELATE4 *, const char, const char ) ;
int bitmap4destroy( BITMAP4 * ) ;
BITMAP4 * bitmap4combineLeafs( BITMAP4 *, BITMAP4 *, BITMAP4 * ) ;
long bitmap4seek( BITMAP4 *, const CONST4 *, const char, const long, const int ) ;
int bitmap4copy( BITMAP4 *, const BITMAP4 * ) ;
void * const4return( L4LOGICAL *, const CONST4 * ) ;
int const4memAlloc( L4LOGICAL *, const unsigned ) ;
int const4duplicate( CONST4 *, const CONST4 *, L4LOGICAL * ) ;
int const4get( CONST4 *, BITMAP4 *, L4LOGICAL *, const int ) ;
int const4less( CONST4 *, CONST4 *, BITMAP4 * ) ;
int const4eq( CONST4 *, CONST4 *, BITMAP4 * ) ;
int const4lessEq( CONST4 *, CONST4 *, BITMAP4 * ) ;
void const4addNe( BITMAP4 *, CONST4 * ) ;
void const4deleteNe( LIST4 *, CONST4 * ) ;
int e4isConstant( E4INFO * ) ;
int e4isTag( E4INFO_REPORT *, EXPR4 *, E4INFO *, DATA4 * ) ;
int log4buildDatabaseLists( L4LOGICAL * ) ;
int log4true( L4LOGICAL * ) ;
int log4bitmapDo( L4LOGICAL * ) ; /* Do everything regarding bitmaps */
int log4determineEvaluationOrder( L4LOGICAL * ) ;
/* functions used to build the sort data list */
int r4dataListAdd( LIST4 *, DATA4 *, RELATE4 * ) ;
int r4dataListFind( LIST4 *, RELATE4 * ) ;
void r4dataListFree( LIST4 * ) ;
int r4dataListBuild( LIST4 *, RELATE4 *, EXPR4 *, int ) ;
void relate4freeBitmaps( RELATE4 * ) ;
RELATE4 *relate4lookupRelate( RELATE4 *, const DATA4 * ) ;
int relate4readIn( RELATE4 * ) ; /* Read a record for this specific data file. */
#ifndef S4STAND_ALONE
int relate4unpack( RELATION4 *, CONNECTION4 * ) ;
#endif
#ifdef S4CLIENT
int relate4clientInit( RELATE4 * ) ;
#endif
#ifdef __cplusplus
}
#endif