fis-gtm/sr_port/op_merge_arg.c

132 lines
4.0 KiB
C

/****************************************************************
* *
* Copyright 2001, 2011 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. *
* *
****************************************************************/
/*
* -----------------------------------------------
* op_merge_arg.c
* ==============
* Description:
* Save arguments of merge command.
* Called twice for MERGE glvn1=glvn2
* Once for glvn1 and once for glvn2
*
* Arguments:
* m_opr_type - MARG1_LCL or, MARG2_LCL or, MARG1_GBL or, MARG2_GBL
* lvp - For local variable's *lv_val. Otherwise it is null.
*
* Return:
* none
*
* Side Effects:
* merge_args saves m_opr_type of each call.
* mglvnp->{gblp,lclp}[] saves glvn1 or glvn2.
*
* Notes:
* For global variable op_gvname saved necessary info in GBLDEFs
* and we cannot pass them as arguments.
* -----------------------------------------------
*/
#include "mdef.h"
#include "gtm_string.h"
#include "lv_val.h"
#include "gdsroot.h"
#include "gdskill.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "merge_def.h"
#include "filestruct.h"
#include "gdscc.h"
#include "copy.h"
#include "jnl.h"
#include "buddy_list.h"
#include "hashtab_int4.h" /* needed for tp.h */
#include "tp.h"
#include "gvname_info.h"
#include "op_merge.h"
#include "format_targ_key.h"
#include "cmidef.h"
#include "cmmdef.h"
GBLREF int merge_args;
GBLREF merge_glvn_ptr mglvnp;
GBLREF gd_region *gv_cur_region;
GBLREF gv_key *gv_currkey;
void op_merge_arg(int m_opr_type, lv_val *lvp)
{
int maxkeysz;
unsigned char buff[MAX_ZWR_KEY_SZ], *end;
char *err_str;
error_def(ERR_UNIMPLOP);
error_def(ERR_TEXT);
error_def(ERR_GVIS);
if (!mglvnp)
{
mglvnp = (merge_glvn_ptr) malloc(SIZEOF(struct merge_glvn_struct_type));
memset(mglvnp, 0, SIZEOF(struct merge_glvn_struct_type));
}
if ((MARG1_GBL == m_opr_type || MARG2_GBL == m_opr_type) && !mglvnp->gblp[IND1])
{
assert(!mglvnp->gblp[IND1] && !mglvnp->gblp[IND2]);
maxkeysz = DBKEYSIZE(MAX_KEY_SZ);
mglvnp->gblp[IND1] = (gvname_info *)malloc(SIZEOF(struct gvname_info_struct));
mglvnp->gblp[IND1]->s_gv_currkey = NULL; /* needed for GVKEY_INIT macro */
GVKEY_INIT(mglvnp->gblp[IND1]->s_gv_currkey, maxkeysz);
mglvnp->gblp[IND2] = (gvname_info *)malloc(SIZEOF(struct gvname_info_struct));
mglvnp->gblp[IND2]->s_gv_currkey = NULL; /* needed for GVKEY_INIT macro */
GVKEY_INIT(mglvnp->gblp[IND2]->s_gv_currkey, maxkeysz);
}
merge_args |= m_opr_type;
switch(m_opr_type)
{
case MARG1_LCL:
mglvnp->lclp[IND1] = lvp;
break;
case MARG1_GBL:
gvname_env_save(mglvnp->gblp[IND1]);
break;
case MARG2_LCL:
mglvnp->lclp[IND2] = lvp;
break;
case MARG2_GBL:
if (dba_bg == gv_cur_region->dyn.addr->acc_meth || dba_mm == gv_cur_region->dyn.addr->acc_meth ||
dba_usr == gv_cur_region->dyn.addr->acc_meth ||
(dba_cm == gv_cur_region->dyn.addr->acc_meth &&
((link_info *)gv_cur_region->dyn.addr->cm_blk->usr)->query_is_queryget))
gvname_env_save(mglvnp->gblp[IND2]);
else
{ /* M ^LHS=^RHS where RHS resides on a remote node served by a GTCM server that does not support QUERYGET
* operation won't work */
assert(dba_cm == gv_cur_region->dyn.addr->acc_meth); /* we should've covered all access methods */
end = format_targ_key(buff, MAX_ZWR_KEY_SZ, gv_currkey, TRUE);
rts_error(VARLSTCNT(14) ERR_UNIMPLOP, 0,
ERR_TEXT, 2, LEN_AND_LIT("GT.CM server does not support MERGE operation"),
ERR_GVIS, 2, end - buff, buff,
ERR_TEXT, 2, REG_LEN_STR(gv_cur_region));
}
break;
default:
GTMASSERT;
}
assert ((merge_args == (MARG1_LCL | MARG2_LCL)) ||
(merge_args == (MARG1_LCL | MARG2_GBL)) ||
(merge_args == (MARG1_GBL | MARG2_LCL)) ||
(merge_args == (MARG1_GBL | MARG2_GBL)) ||
(merge_args == MARG2_GBL) ||
(merge_args == MARG2_LCL));
}