262 lines
8.2 KiB
C
262 lines
8.2 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2001, 2010 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 <signal.h>
|
|
|
|
#include "gdsroot.h"
|
|
#include "gtm_facility.h"
|
|
#include "fileinfo.h"
|
|
#include "gdsbt.h"
|
|
#include "gdsfhead.h"
|
|
#include "gdsblk.h"
|
|
#include "gdsbml.h"
|
|
#include "cli.h"
|
|
#include "dse.h"
|
|
#include "util.h"
|
|
|
|
/* Include prototypes */
|
|
#include "t_qread.h"
|
|
|
|
#define REUSABLE_CHAR ":"
|
|
#define FREE_CHAR "."
|
|
#define BUSY_CHAR "X"
|
|
#define CORRUPT_CHAR "?"
|
|
#define MAX_UTIL_LEN 80
|
|
|
|
GBLREF VSIG_ATOMIC_T util_interrupt;
|
|
GBLREF block_id patch_curr_blk;
|
|
GBLREF sgmnt_addrs *cs_addrs;
|
|
GBLREF gd_region *gv_cur_region;
|
|
GBLREF int patch_is_fdmp;
|
|
GBLREF int patch_fdmp_recs;
|
|
GBLREF int patch_rec_counter;
|
|
LITREF char *gtm_dbversion_table[];
|
|
|
|
boolean_t dse_b_dmp(void)
|
|
{
|
|
int4 util_len, head, lmap_num, iter1, iter2, mapsize, bplmap, nocrit_present, dummy_int, len, count;
|
|
unsigned char util_buff[MAX_UTIL_LEN], mask;
|
|
boolean_t free, was_crit, invalid_bitmap = FALSE, is_mm;
|
|
block_id blk;
|
|
sm_uc_ptr_t bp, b_top, rp, mb, dump_record(sm_uc_ptr_t rp, block_id blk, sm_uc_ptr_t bp, sm_uc_ptr_t b_top);
|
|
cache_rec_ptr_t cr;
|
|
enum db_ver ondsk_blkver;
|
|
|
|
error_def(ERR_DSEBLKRDFAIL);
|
|
error_def(ERR_CTRLC);
|
|
error_def(ERR_BITMAPSBAD);
|
|
|
|
head = cli_present("HEADER");
|
|
if (CLI_PRESENT == cli_present("BLOCK"))
|
|
{
|
|
if (!cli_get_hex("BLOCK", (uint4 *)&blk))
|
|
return FALSE;
|
|
if (blk < 0 || blk >= cs_addrs->ti->total_blks)
|
|
{
|
|
util_out_print("Error: invalid block number.", TRUE);
|
|
return FALSE;
|
|
}
|
|
patch_curr_blk = blk;
|
|
} else
|
|
blk = patch_curr_blk;
|
|
if (CLI_PRESENT == cli_present("COUNT"))
|
|
{
|
|
if (!cli_get_hex("COUNT", (uint4 *)&count))
|
|
return FALSE;
|
|
if (count < 1)
|
|
return FALSE;
|
|
} else
|
|
count = 1;
|
|
|
|
util_out_print(0, TRUE);
|
|
bplmap = cs_addrs->hdr->bplmap;
|
|
is_mm = (dba_mm == cs_addrs->hdr->acc_meth);
|
|
mapsize = BM_SIZE(bplmap);
|
|
patch_rec_counter = 1;
|
|
was_crit = cs_addrs->now_crit;
|
|
nocrit_present = (CLI_NEGATED == cli_present("CRIT"));
|
|
DSE_GRAB_CRIT_AS_APPROPRIATE(was_crit, nocrit_present, cs_addrs, gv_cur_region);
|
|
for ( ; ; )
|
|
{
|
|
if (blk / bplmap * bplmap != blk)
|
|
{
|
|
if (!(bp = t_qread(blk, &dummy_int, &cr)))
|
|
{
|
|
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, nocrit_present, cs_addrs, gv_cur_region);
|
|
rts_error(VARLSTCNT(1) ERR_DSEBLKRDFAIL);
|
|
}
|
|
if (((blk_hdr_ptr_t) bp)->levl && patch_is_fdmp)
|
|
{
|
|
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, nocrit_present, cs_addrs, gv_cur_region);
|
|
util_out_print("Error: cannot perform GLO/ZWR dump on index block.", TRUE);
|
|
return FALSE;
|
|
}
|
|
if (((blk_hdr_ptr_t) bp)->bsiz > cs_addrs->hdr->blk_size)
|
|
b_top = bp + cs_addrs->hdr->blk_size;
|
|
else if (((blk_hdr_ptr_t) bp)->bsiz < SIZEOF(blk_hdr))
|
|
b_top = bp + SIZEOF(blk_hdr);
|
|
else
|
|
b_top = bp + ((blk_hdr_ptr_t) bp)->bsiz;
|
|
if (CLI_NEGATED != head && !patch_is_fdmp)
|
|
{ memcpy(util_buff, "Block ", 6);
|
|
util_len = 6;
|
|
util_len += i2hex_nofill(blk, &util_buff[util_len], 8);
|
|
memcpy(&util_buff[util_len], " Size ", 8);
|
|
util_len += 8;
|
|
util_len += i2hex_nofill(((blk_hdr_ptr_t)bp)->bsiz, &util_buff[util_len], 8);
|
|
memcpy(&util_buff[util_len], " Level !UL TN ", 18);
|
|
util_len += 18;
|
|
util_len += i2hexl_nofill(((blk_hdr_ptr_t)bp)->tn, &util_buff[util_len], 16);
|
|
memcpy(&util_buff[util_len], " ", 1);
|
|
util_len++;
|
|
ondsk_blkver = (!is_mm ? cr->ondsk_blkver : GDSV5);
|
|
len = STRLEN(gtm_dbversion_table[ondsk_blkver]);
|
|
memcpy(&util_buff[util_len], gtm_dbversion_table[ondsk_blkver], len);
|
|
util_len += len;
|
|
memcpy(&util_buff[util_len], "!/", 2);
|
|
util_len += 2;
|
|
util_buff[util_len] = 0;
|
|
util_out_print((caddr_t)util_buff, TRUE, ((blk_hdr_ptr_t) bp)->levl );
|
|
}
|
|
rp = bp + SIZEOF(blk_hdr);
|
|
if (CLI_PRESENT != head && (!patch_is_fdmp || ((blk_hdr_ptr_t) bp)->levl == 0))
|
|
{
|
|
while (!util_interrupt && (rp = dump_record(rp, blk, bp, b_top)))
|
|
patch_rec_counter += 1;
|
|
}
|
|
if (util_interrupt)
|
|
{
|
|
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, nocrit_present, cs_addrs, gv_cur_region);
|
|
rts_error(VARLSTCNT(1) ERR_CTRLC);
|
|
break;
|
|
}
|
|
if (CLI_NEGATED == head)
|
|
util_out_print(0, TRUE);
|
|
} else if (!patch_is_fdmp)
|
|
{
|
|
if (!(bp = t_qread(blk, &dummy_int, &cr)))
|
|
{
|
|
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, nocrit_present, cs_addrs, gv_cur_region);
|
|
rts_error(VARLSTCNT(1) ERR_DSEBLKRDFAIL);
|
|
}
|
|
if (CLI_NEGATED != head)
|
|
{
|
|
|
|
if (bplmap == 0)
|
|
{
|
|
memcpy(util_buff, "Block ", 6);
|
|
util_len = 6;
|
|
util_len += i2hex_nofill(blk, &util_buff[util_len], 8);
|
|
memcpy(&util_buff[util_len], " Size ", 8);
|
|
util_len += 8;
|
|
util_len += i2hex_nofill(mapsize, &util_buff[util_len], 4);
|
|
memcpy(&util_buff[util_len], " Master Status: Cannot Determine (bplmap == 0)!/", 50);
|
|
util_len += 50;
|
|
util_buff[util_len] = 0;
|
|
util_out_print((caddr_t)util_buff, TRUE );
|
|
} else
|
|
{
|
|
mb = cs_addrs->bmm + blk / (8 * bplmap);
|
|
lmap_num = blk / bplmap;
|
|
mask = 1 << ( lmap_num - lmap_num / 8 * 8);
|
|
free = mask & *mb;
|
|
memcpy(util_buff, "Block ", 6);
|
|
util_len = 6;
|
|
util_len += i2hex_nofill(blk, &util_buff[util_len], 8);
|
|
memcpy(&util_buff[util_len], " Size ", 7);
|
|
util_len += 7;
|
|
util_len += i2hex_nofill(((blk_hdr_ptr_t)bp)->bsiz, &util_buff[util_len], 8);
|
|
memcpy(&util_buff[util_len], " Level !SB TN ", 16);
|
|
util_len += 16;
|
|
util_len += i2hexl_nofill(((blk_hdr_ptr_t)bp)->tn, &util_buff[util_len], 16);
|
|
memcpy(&util_buff[util_len], " ", 1);
|
|
util_len++;
|
|
ondsk_blkver = (!is_mm ? cr->ondsk_blkver : GDSV5);
|
|
len = STRLEN(gtm_dbversion_table[ondsk_blkver]);
|
|
memcpy(&util_buff[util_len], gtm_dbversion_table[ondsk_blkver], len);
|
|
util_len += len;
|
|
util_buff[util_len] = 0;
|
|
util_out_print((caddr_t)util_buff, FALSE, ((blk_hdr_ptr_t) bp)->levl );
|
|
util_len = 0;
|
|
memcpy(&util_buff[util_len], " Master Status: !AD!/",23);
|
|
util_len = 23;
|
|
util_buff[util_len] = 0;
|
|
util_out_print((caddr_t)util_buff, TRUE, free ? 10 : 4, free ? "Free Space" : "Full");
|
|
}
|
|
}
|
|
if (CLI_PRESENT != head)
|
|
{
|
|
util_out_print(" !_Low order High order", TRUE);
|
|
|
|
lmap_num = 0;
|
|
while (lmap_num < bplmap)
|
|
{ memcpy(util_buff, "Block ", 6);
|
|
util_len = 6;
|
|
i2hex_blkfill(blk + lmap_num, &util_buff[util_len], 8);
|
|
util_len += 8;
|
|
memcpy(&util_buff[util_len], ":!_| ", 6);
|
|
util_len += 6;
|
|
util_buff[util_len] = 0;
|
|
util_out_print((caddr_t)util_buff, FALSE);
|
|
for (iter1 = 0; iter1 < 4; iter1++)
|
|
{
|
|
for (iter2 = 0; iter2 < 8; iter2++)
|
|
{
|
|
mask = dse_lm_blk_free(lmap_num * BML_BITS_PER_BLK, bp + SIZEOF(blk_hdr));
|
|
if (!mask)
|
|
util_out_print("!AD", FALSE, 1, BUSY_CHAR);
|
|
else if (BLK_FREE == mask)
|
|
util_out_print("!AD", FALSE, 1, FREE_CHAR);
|
|
else if (BLK_RECYCLED == mask)
|
|
util_out_print("!AD", FALSE, 1, REUSABLE_CHAR);
|
|
else {
|
|
invalid_bitmap = TRUE;
|
|
util_out_print("!AD", FALSE, 1, CORRUPT_CHAR);
|
|
}
|
|
if (++lmap_num >= bplmap)
|
|
break;
|
|
}
|
|
util_out_print(" ", FALSE);
|
|
if (lmap_num >= bplmap)
|
|
break;
|
|
}
|
|
util_out_print("|", TRUE);
|
|
if (util_interrupt)
|
|
{
|
|
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, nocrit_present, cs_addrs, gv_cur_region);
|
|
rts_error(VARLSTCNT(1) ERR_CTRLC);
|
|
}
|
|
}
|
|
util_out_print("!/'!AD' == BUSY '!AD' == FREE '!AD' == REUSABLE '!AD' == CORRUPT!/",
|
|
TRUE,1, BUSY_CHAR, 1, FREE_CHAR, 1, REUSABLE_CHAR, 1, CORRUPT_CHAR);
|
|
if (invalid_bitmap)
|
|
{
|
|
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, nocrit_present, cs_addrs, gv_cur_region);
|
|
rts_error(VARLSTCNT(1) ERR_BITMAPSBAD);
|
|
}
|
|
}
|
|
}
|
|
count--;
|
|
if (count <= 0 || util_interrupt)
|
|
break;
|
|
blk++;
|
|
if (blk >= cs_addrs->ti->total_blks)
|
|
blk = 0;
|
|
}
|
|
patch_curr_blk = blk;
|
|
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, nocrit_present, cs_addrs, gv_cur_region);
|
|
return TRUE;
|
|
}
|