166 lines
5.0 KiB
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;
|
|
}
|