fis-gtm/sr_port/muextr.h

169 lines
6.3 KiB
C
Raw Permalink Normal View History

/****************************************************************
* *
2024-07-19 11:43:27 -04:00
* Copyright 2001, 2012 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. *
* *
****************************************************************/
typedef struct glist_struct
{
struct glist_struct *next;
mval name;
unsigned char nbuf[1]; /* dummy entry */
} glist;
typedef struct
{
int recknt;
int reclen;
int keylen;
int datalen;
} mu_extr_stats;
typedef struct coll_hdr_struct
{
unsigned char act;
unsigned char nct;
unsigned char ver;
unsigned char pad;
} coll_hdr;
#ifdef GTM_CRYPT
/* The following structure is used by mupip extract/load to store the hash of all the extracted dat files. These hashes will be
* stored right after the extract header is written. Each hash will be referred by it's index number at the beginning of each
* record. This information will be used during mupip load to decrypt a particular record. Although the structure contains only
* one field, we need to access the hashes by index. */
typedef struct muextr_hash_hdr_struct
{
char gtmcrypt_hash[GTMCRYPT_HASH_LEN];
} muext_hash_hdr;
typedef muext_hash_hdr *muext_hash_hdr_ptr_t;
#endif
#define MU_FMT_GO 0
#define MU_FMT_BINARY 1
#define MU_FMT_GOQ 2
#define MU_FMT_ZWR 3
#define GOQ_BLK_SIZE 2048
#define FORMAT_STR_MAX_SIZE 50
#define LABEL_STR_MAX_SIZE 128
#define EXTR_DEFAULT_LABEL "GT.M MUPIP EXTRACT"
/* In unix, the binary extract label was bumped to 5 as part of the db encryption changes. Since db encryption is not supported in
* VMS, we keep the label at 4 for VMS. Whenever the extract label needs to be bumped up next, if possible, try to get both Unix
* and VMS back to common label (might need to add a field in the extract header to indicate whether encryption is supported
* or not as part of this change). */
#ifdef UNIX
#define V4_BIN_HEADER_VERSION "4"
#define V4_BIN_HEADER_LABEL "GDS BINARY EXTRACT LEVEL "V4_BIN_HEADER_VERSION
2024-07-19 11:43:27 -04:00
#define V5_BIN_HEADER_VERSION "5"
#define V5_BIN_HEADER_SZ 92 /* V4 (GTM V5.0) binary header stores null collation information [5 bytes numeric] */
#define V5_BIN_HEADER_NUMSZ 5
#define V5_BIN_HEADER_LABEL "GDS BINARY EXTRACT LEVEL "V5_BIN_HEADER_VERSION
#define V5_BIN_HEADER_RECOFFSET (STR_LIT_LEN(BIN_HEADER_LABEL) + STR_LIT_LEN(BIN_HEADER_DATEFMT) + V5_BIN_HEADER_NUMSZ)
#define V5_BIN_HEADER_KEYOFFSET (STR_LIT_LEN(BIN_HEADER_LABEL) + STR_LIT_LEN(BIN_HEADER_DATEFMT) + 2 * V5_BIN_HEADER_NUMSZ)
#define V5_BIN_HEADER_NULLCOLLOFFSET (STR_LIT_LEN(BIN_HEADER_LABEL) + STR_LIT_LEN(BIN_HEADER_DATEFMT) + 3 * V5_BIN_HEADER_NUMSZ)
#define BIN_HEADER_VERSION "6" /* spanning nodes allow max_rec_len to 7 digits*/
#define BIN_HEADER_LABEL "GDS BINARY EXTRACT LEVEL "BIN_HEADER_VERSION
#define BIN_HEADER_VERSION_ENCR "7" /* follow convention of low bit of version indicating encryption */
#define BIN_HEADER_LABEL_ENCR "GDS BINARY EXTRACT LEVEL "BIN_HEADER_VERSION_ENCR
#define BIN_HEADER_SZ 100
#define BIN_HEADER_NUMSZ 7
#else
#define BIN_HEADER_VERSION "4"
2024-07-19 11:43:27 -04:00
#define BIN_HEADER_NUMSZ 5
#define BIN_HEADER_SZ 92 /* V4 (GTM V5.0) binary header stores null collation information [5 bytes numeric] */
#endif
#define BIN_HEADER_LABEL "GDS BINARY EXTRACT LEVEL "BIN_HEADER_VERSION
#define BIN_HEADER_DATEFMT "YEARMMDD2460SS"
#define BIN_HEADER_LABELSZ 32
#define BIN_HEADER_BLKOFFSET (STR_LIT_LEN(BIN_HEADER_LABEL) + STR_LIT_LEN(BIN_HEADER_DATEFMT))
#define BIN_HEADER_RECOFFSET (STR_LIT_LEN(BIN_HEADER_LABEL) + STR_LIT_LEN(BIN_HEADER_DATEFMT) + BIN_HEADER_NUMSZ)
#define BIN_HEADER_KEYOFFSET (STR_LIT_LEN(BIN_HEADER_LABEL) + STR_LIT_LEN(BIN_HEADER_DATEFMT) + 2 * BIN_HEADER_NUMSZ)
#define BIN_HEADER_NULLCOLLOFFSET (STR_LIT_LEN(BIN_HEADER_LABEL) + STR_LIT_LEN(BIN_HEADER_DATEFMT) + 3 * BIN_HEADER_NUMSZ)
#define V3_BIN_HEADER_SZ 87
#define EXTR_HEADER_LEVEL(extr_lbl) *(extr_lbl + SIZEOF(BIN_HEADER_LABEL) - 2)
/* the assumption here is - level wont go beyond a single char representation */
#define MAX_BIN_WRT ROUND_DOWN(MAX_RMS_RECORDSIZE, SIZEOF(int))
char *mu_extr_ident(mstr *a);
void mu_extract(void);
int mu_extr_getblk(unsigned char *ptr); /***type int added***/
#if defined(UNIX) && defined(GTM_CRYPT)
boolean_t mu_extr_gblout(mval *gn, mu_extr_stats *st, int format, muext_hash_hdr_ptr_t hash_array,
boolean_t is_any_file_encrypted);
#elif defined(UNIX)
boolean_t mu_extr_gblout(mval *gn, mu_extr_stats *st, int format);
#endif
#ifdef UNIX
#define WRITE_BIN_EXTR_BLK(BUFF, BSIZE) \
{ \
GBLREF io_pair io_curr_device; \
mval val; \
val.mvtype = MV_STR; \
val.str.addr = (char *)(&BSIZE); \
val.str.len = SIZEOF(BSIZE); \
op_write(&val); \
val.mvtype = MV_STR; \
val.str.addr = (char *)(BUFF); \
val.str.len = BSIZE; \
op_write(&val); \
io_curr_device.out->dollar.x = 0; \
io_curr_device.out->dollar.y = 0; \
}
#define WRITE_EXTR_LINE(BUFF, BSIZE) \
{ \
mval val; \
val.mvtype = MV_STR; \
val.str.addr = (char *)(BUFF); \
val.str.len = BSIZE; \
op_write(&val); \
op_wteol(1); \
}
#elif defined(VMS)
#define WRITE_BIN_EXTR_BLK(PTR, SIZE) \
{ \
unsigned short size; \
int status; \
if (MAX_BIN_WRT < (SIZE)) \
size = MAX_BIN_WRT; \
else \
size = (SIZE); \
(outrab)->rab$w_rsz = size; \
(outrab)->rab$l_rbf = (unsigned char *)(PTR); \
status = sys$put((outrab)); \
if ((MAX_BIN_WRT < (SIZE)) && (RMS$_NORMAL == status)) \
{ \
assert(MAX_BIN_WRT == size); \
(outrab)->rab$w_rsz = (SIZE) - MAX_BIN_WRT; \
(outrab)->rab$l_rbf = (unsigned char *)(PTR); \
(outrab)->rab$l_rbf += MAX_BIN_WRT; \
status = sys$put((outrab)); \
} \
if (!(status & 1)) \
{ \
rts_error(VARLSTCNT(1) status); \
mupip_exit(status); \
} \
}
#define WRITE_EXTR_LINE(PTR, SIZE) \
{ \
int status; \
(outrab)->rab$l_rbf = (unsigned char *)(PTR); \
(outrab)->rab$w_rsz = (SIZE); \
status = sys$put((outrab)); \
if (status != RMS$_NORMAL) \
rts_error(VARLSTCNT(1) status); \
}
boolean_t mu_extr_gblout(mval *gn, struct RAB *outrab, mu_extr_stats *st, int format);
#else
#error UNSUPPORTED PLATFORM
#endif