fis-gtm/sr_port/collseq.h

102 lines
3.3 KiB
C

/****************************************************************
* *
* Copyright 2001, 2011 Fidelity Information Services, Inc *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#ifndef COLLSEQ_H_INCLUDED
#define COLLSEQ_H_INCLUDED
#include "min_max.h"
#define MAX_COLLTYPE 255
#define MIN_COLLTYPE 0
#define XFORM 0
#define XBACK 1
#define ALLOC_XFORM_BUFF(STR1LEN) \
{ \
mstr_len_t lcl_len; \
\
if (0 == TREF(max_lcl_coll_xform_bufsiz)) \
{ \
assert(NULL == TREF(lcl_coll_xform_buff)); \
TREF(max_lcl_coll_xform_bufsiz) = MAX_STRBUFF_INIT; \
TREF(lcl_coll_xform_buff) = (char *)malloc(TREF(max_lcl_coll_xform_bufsiz)); \
} \
lcl_len = STR1LEN; \
assert(MAX_STRLEN >= lcl_len); \
if (lcl_len > TREF(max_lcl_coll_xform_bufsiz)) \
{ \
assert(NULL != TREF(lcl_coll_xform_buff)); \
free(TREF(lcl_coll_xform_buff)); \
assert(MAX_STRLEN >= TREF(max_lcl_coll_xform_bufsiz)); \
while (lcl_len > TREF(max_lcl_coll_xform_bufsiz)) \
TREF(max_lcl_coll_xform_bufsiz) *= 2; \
TREF(max_lcl_coll_xform_bufsiz) = MIN(MAX_STRLEN, TREF(max_lcl_coll_xform_bufsiz)); \
TREF(lcl_coll_xform_buff) = (char *)malloc(TREF(max_lcl_coll_xform_bufsiz)); \
} \
}
/*
Following two macros are currently used in replication filters, merge command and binary load to transform
GTM null subscripts collation to standard null subscript collation and vice versa
*/
#define GTM2STDNULLCOLL(key, len) \
{ \
unsigned char *currptr, *ptrtop; \
\
currptr = (unsigned char *)(key); \
ptrtop = (currptr + (len)); \
assert(currptr < ptrtop); \
do { \
if ((STR_SUB_PREFIX == *currptr++) && (KEY_DELIMITER == *currptr)) \
*(currptr - 1) = SUBSCRIPT_STDCOL_NULL; \
assert(currptr <= ptrtop); \
while ((currptr < ptrtop) && (KEY_DELIMITER != *currptr++)) \
; \
} while ((currptr < ptrtop) && (KEY_DELIMITER != *currptr)); \
assert(currptr <= ptrtop); \
}
#define STD2GTMNULLCOLL(key, len) \
{ \
unsigned char *currptr, *ptrtop; \
\
currptr = (unsigned char *)(key); \
ptrtop = (currptr + (len)); \
assert(currptr < ptrtop); \
do { \
if ((SUBSCRIPT_STDCOL_NULL == *currptr++) && (KEY_DELIMITER == *currptr)) \
*(currptr - 1) = STR_SUB_PREFIX; \
assert(currptr <= ptrtop); \
while ((currptr < ptrtop) && (KEY_DELIMITER != *currptr++)) \
; \
} while ((currptr < ptrtop) && (KEY_DELIMITER != *currptr)); \
assert(currptr <= ptrtop); \
}
typedef struct collseq_struct {
struct collseq_struct *flink;
int act;
int4 (*xform)();
int4 (*xback)();
int4 (*version)();
int4 (*verify)();
int argtype;
} collseq;
boolean_t map_collseq(mstr *fspec, collseq *ret_collseq);
collseq *ready_collseq(int act);
int4 do_verify(collseq *csp, unsigned char type, unsigned char ver);
int find_local_colltype(void);
void act_in_gvt(void);
#endif /* COLLSEQ_H_INCLUDED */