fis-gtm/sr_port/dse_fdmp.c

166 lines
5.0 KiB
C

/****************************************************************
* *
* 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. *
* *
****************************************************************/
#include "mdef.h"
#include "gtm_string.h"
#include "mlkdef.h"
#include "gdsroot.h"
#include "gdsbt.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsfhead.h"
#include "gtmctype.h"
#include "cli.h"
#include "dse.h"
#include "gvsub2str.h"
#include "gdsblk.h"
#include "zshow.h"
#define COUNT_TRAILING_ZERO(NUM, WCP, TRAIL_ZERO) \
{ \
if (0 == NUM) \
*WCP++ = '0'; \
for (TRAIL_ZERO = 0; (NUM > 0) && (0 == (NUM % 10)); TRAIL_ZERO++, NUM /= 10) \
; \
}
#define OUTPUT_NUMBER(NUM, WCP, TRAIL_ZERO) \
{ \
for (rev_num = 0; NUM > 0; rev_num = (rev_num * 10 + NUM % 10), NUM /= 10) \
; \
for (; rev_num > 0; *WCP++ = (rev_num % 10 + ASCII_0), rev_num /= 10) \
; \
for (; TRAIL_ZERO > 0 ; *WCP++ = '0', TRAIL_ZERO--) \
; \
}
GBLREF enum dse_fmt dse_dmp_format;
GBLREF gd_region *gv_cur_region;
GBLREF char patch_comp_key[MAX_KEY_SZ + 1];
static unsigned char *work_buff;
static unsigned int work_buff_length;
boolean_t dse_fdmp(sm_uc_ptr_t data, int len)
{
unsigned char *key_char_ptr, *work_char_ptr;
int dest_len;
unsigned char *ret_addr;
boolean_t is_snblk=FALSE;
span_subs *ss_ptr; /*spanning node key pointer */
unsigned int snbid, offset, trail_zero, rev_num, num;
unsigned short blk_sz;
if (work_buff_length < ZWR_EXP_RATIO(gv_cur_region->max_rec_size))
{
work_buff_length = ZWR_EXP_RATIO(gv_cur_region->max_rec_size);
if (work_buff)
free (work_buff);
work_buff = (unsigned char *)malloc(work_buff_length);
}
work_char_ptr = work_buff;
*work_char_ptr++ = '^';
for (key_char_ptr = (uchar_ptr_t)patch_comp_key; *key_char_ptr ; key_char_ptr++)
{
if (PRINTABLE(*key_char_ptr))
*work_char_ptr++ = *key_char_ptr;
else
return FALSE;
}
key_char_ptr++;
if (SPAN_START_BYTE != *key_char_ptr) /*Global has subscript*/
{
*work_char_ptr++ = '(';
for (;;)
{
work_char_ptr = gvsub2str(key_char_ptr, work_char_ptr, TRUE);
/* Removed unnecessary checks for printable characters (PRINTABLE()) here
* since the data being written into files (OPENed files) would have been
* passed through ZWR translation which would have taken care of converting
* to $CHAR() or $ZCHAR() */
for (; *key_char_ptr ; key_char_ptr++)
;
key_char_ptr++;
/* Check if this is spanning node if yes break out of the loop */
if (SPAN_START_BYTE == *key_char_ptr
&& (int)*(key_char_ptr + 1) >= SPAN_BYTE_MIN
&& (int)*(key_char_ptr + 2) >= SPAN_BYTE_MIN)
{
is_snblk = TRUE;
break;
}
if (*key_char_ptr)
*work_char_ptr++ = ',';
else
break;
}
*work_char_ptr++ = ')';
} else /*Spanning node without subscript*/
is_snblk = TRUE;
if (is_snblk)
{
ss_ptr = (span_subs *)key_char_ptr;
snbid = SPAN_GVSUBS2INT(ss_ptr);
key_char_ptr = key_char_ptr + SPAN_SUBS_LEN + 1; /* Move out of special subscript of spanning node */
blk_sz = gv_cur_region->dyn.addr->blk_size;
/* Decide the offset of the content of a block inside the value of spanning node*/
offset = (snbid) ? (blk_sz - (SIZEOF(blk_hdr) + SIZEOF(rec_hdr) + gv_cur_region->dyn.addr->reserved_bytes
+ (key_char_ptr - (uchar_ptr_t)patch_comp_key + 1))) * (snbid - 1) : 0 ;
ret_addr =(unsigned char *)memmove((void *)(work_buff+4), (void *)work_buff, (work_char_ptr - work_buff));
assert(*ret_addr == '^');
*work_buff = '$';
*(work_buff + 1) = 'z';
*(work_buff + 2) = 'e';
*(work_buff + 3) = '(';
/* length of "$ze(" is 4, so move the work_char_ptr by 4*/
work_char_ptr = work_char_ptr + 4;
*work_char_ptr++ = ',';
/* Dump the offset of the content of a block inside the value of spanning node */
num = snbid ? offset : 0;
COUNT_TRAILING_ZERO(num, work_char_ptr, trail_zero);
num = offset;
OUTPUT_NUMBER(num, work_char_ptr, trail_zero);
*work_char_ptr++ = ',';
/* Dump the length of the content of a block */
num = snbid ? len : 0;
COUNT_TRAILING_ZERO(num, work_char_ptr, trail_zero);
num = snbid ? len : 0;
OUTPUT_NUMBER(num, work_char_ptr, trail_zero);
*work_char_ptr++ = ')';
}
assert(MAX_ZWR_KEY_SZ >= work_char_ptr - work_buff);
if (GLO_FMT == dse_dmp_format)
{
if (!dse_fdmp_output(work_buff, (int4)(work_char_ptr - work_buff)))
return FALSE;
if (!dse_fdmp_output(data, len))
return FALSE;
} else
{
assert(ZWR_FMT == dse_dmp_format);
*work_char_ptr++ = '=';
if(is_snblk && !snbid)
{
*work_char_ptr++ = '"';
*work_char_ptr++ = '"';
dest_len = 0;
} else
format2zwr(data, len, work_char_ptr, &dest_len);
if (!dse_fdmp_output(work_buff, (int4)(work_char_ptr + dest_len - work_buff)))
return FALSE;
}
return TRUE;
}