File: dse_f_reg.c

package info (click to toggle)
fis-gtm 6.3-014-3
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 36,680 kB
  • sloc: ansic: 333,039; asm: 5,180; csh: 4,956; sh: 1,924; awk: 291; makefile: 66; sed: 13
file content (129 lines) | stat: -rw-r--r-- 4,056 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/****************************************************************
 *								*
 * Copyright (c) 2001-2018 Fidelity National Information	*
 * Services, Inc. and/or its subsidiaries. All rights reserved.	*
 *								*
 *	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 "gdsroot.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "filestruct.h"
#include "util.h"
#include "cli.h"
#include "dse.h"
#include "gtmmsg.h"
#include "gvcst_protos.h"

GBLREF block_id		patch_curr_blk;
GBLREF gd_region	*gv_cur_region;
GBLREF sgmnt_data_ptr_t	cs_data;
GBLREF sgmnt_addrs	*cs_addrs;
GBLREF short		crash_count;
GBLREF mval		dollar_zgbldir;
GBLREF gd_addr		*original_header;
GBLREF gv_namehead	*gv_target;
GBLREF gv_key		*gv_currkey;

error_def(ERR_DSENOTOPEN);
error_def(ERR_NOGTCMDB);
error_def(ERR_NOREGION);
error_def(ERR_NOUSERDB);

void dse_f_reg(void)
{
	char		rn[MAX_RN_LEN];
	unsigned short	rnlen;
	int		i;
	boolean_t	found;
	gd_region	*regptr, *statsDBreg;

	rnlen = SIZEOF(rn);
	if (!cli_get_str("REGION", rn, &rnlen))
		return;
	if (('*' == rn[0]) && (1 == rnlen))
	{
		util_out_print("List of global directory:!_!AD!/", TRUE, dollar_zgbldir.str.len, dollar_zgbldir.str.addr);
		for (i = 0, regptr = original_header->regions; i < original_header->n_regions; i++, regptr++)
		{
			if (0 == regptr->dyn.addr->fname_len)
				continue;				/* skip inactive statsDB */
			util_out_print("!/File  !_!AD", TRUE, regptr->dyn.addr->fname_len, &regptr->dyn.addr->fname[0]);
			util_out_print("Region!_!AD", TRUE, REG_LEN_STR(regptr));
		}
		return;
	}
	assert(rn[0]);
	for (i = 0; i < rnlen; i++)				/* Region names are always upper-case ASCII */
		rn[i] = TOUPPER(rn[i]);
	found = FALSE;
	for (i = 0, regptr = original_header->regions; i < original_header->n_regions ;i++, regptr++)
	{
		if (found = !memcmp(&regptr->rname[0], &rn[0], MAX_RN_LEN))
			break;
	}
	if (!found)
	{
		gtm_putmsg_csa(CSA_ARG(NULL) VARLSTCNT(4) ERR_NOREGION, 2, rnlen, rn);
		return;
	}
	assert(!IS_STATSDB_REG(regptr));
	if (CLI_PRESENT == cli_present("STATS"))
	{	/* Go to corresponding STATSDB if present */
		if (!(RDBF_NOSTATS & regptr->reservedDBFlags))
		{
			BASEDBREG_TO_STATSDBREG(regptr, statsDBreg);
			assert(NULL != statsDBreg);
			if (!statsDBreg->open)
				gv_init_reg(statsDBreg, NULL);
			regptr = statsDBreg;
		} else
		{
			util_out_print("Error:  Region: !AD does not have an associated stats region", TRUE, REG_LEN_STR(regptr));
			return;
		}
	}
	if (regptr == gv_cur_region)
	{
		util_out_print("Error:  already in region: !AD", TRUE, REG_LEN_STR(gv_cur_region));
		return;
	}
	/* reg_cmcheck would have already been called for ALL regions at region_init time. In Unix, this would have set
	 * reg->dyn.addr->acc_meth to dba_cm if it is remote database. So we can safely use this to check if the region
	 * is dba_cm or not.
	 */
	if (dba_cm == regptr->dyn.addr->acc_meth)
	{
		gtm_putmsg_csa(CSA_ARG(NULL) VARLSTCNT(6) ERR_NOGTCMDB, 4, LEN_AND_LIT("DSE"), rnlen, rn);
		return;
	}
	if (!regptr->open)
	{
		gtm_putmsg_csa(CSA_ARG(NULL) VARLSTCNT(4) ERR_DSENOTOPEN, 2, rnlen, rn);
		return;
	}
	if (cs_addrs->now_crit)
		util_out_print("Warning:  now leaving region in critical section: !AD", TRUE, REG_LEN_STR(gv_cur_region));
	gv_cur_region = regptr;
	gv_target = NULL;	/* to prevent out-of-sync situations between gv_target and cs_addrs */
	assert(IS_REG_BG_OR_MM(gv_cur_region));
	cs_addrs = &FILE_INFO(gv_cur_region)->s_addrs;
	cs_data = cs_addrs->hdr;
	UPDATE_CRASH_COUNT(cs_addrs, crash_count);
	util_out_print("!/File  !_!AD", TRUE, DB_LEN_STR(gv_cur_region));
	util_out_print("Region!_!AD!/", TRUE, REG_LEN_STR(gv_cur_region));
	patch_curr_blk = get_dir_root();
	gv_init_reg(gv_cur_region, NULL);
	return;
}