2012-02-05 11:35:58 -05:00
|
|
|
/****************************************************************
|
|
|
|
* *
|
|
|
|
* 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. *
|
|
|
|
* *
|
|
|
|
****************************************************************/
|
|
|
|
|
|
|
|
#include "mdef.h"
|
|
|
|
|
|
|
|
#include "gtm_string.h"
|
|
|
|
#include "min_max.h"
|
|
|
|
#include "gdsroot.h"
|
|
|
|
#include "gdskill.h"
|
|
|
|
#include "gtm_facility.h"
|
|
|
|
#include "fileinfo.h"
|
|
|
|
#include "gdsbt.h"
|
|
|
|
#include "gdsfhead.h"
|
|
|
|
#include "zshow.h"
|
|
|
|
#include "zwrite.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 "merge_def.h"
|
|
|
|
#include "gvname_info.h"
|
|
|
|
#include "op_merge.h"
|
|
|
|
#include "format_targ_key.h"
|
|
|
|
#include "ddphdr.h"
|
|
|
|
|
|
|
|
GBLREF int merge_args;
|
|
|
|
GBLREF merge_glvn_ptr mglvnp;
|
|
|
|
|
2012-03-24 14:06:46 -04:00
|
|
|
error_def(ERR_MERGEDESC);
|
|
|
|
|
|
|
|
boolean_t merge_desc_check(void)
|
2012-02-05 11:35:58 -05:00
|
|
|
{
|
2012-03-24 14:06:46 -04:00
|
|
|
unsigned char buff1[MAX_ZWR_KEY_SZ], buff2[MAX_ZWR_KEY_SZ], *end1, *end2;
|
2012-02-05 11:35:58 -05:00
|
|
|
enum db_acc_method acc_meth1, acc_meth2;
|
|
|
|
gd_region *reg1, *reg2;
|
|
|
|
gv_namehead *gvt1, *gvt2;
|
|
|
|
|
|
|
|
if (MARG1_IS_GBL(merge_args) && MARG2_IS_GBL(merge_args))
|
|
|
|
{
|
|
|
|
reg1 = mglvnp->gblp[IND1]->s_gv_cur_region;
|
|
|
|
reg2 = mglvnp->gblp[IND2]->s_gv_cur_region;
|
|
|
|
gvt1 = mglvnp->gblp[IND1]->s_gv_target;
|
|
|
|
gvt2 = mglvnp->gblp[IND2]->s_gv_target;
|
|
|
|
acc_meth1 = reg1->dyn.addr->acc_meth;
|
|
|
|
acc_meth2 = reg2->dyn.addr->acc_meth;
|
|
|
|
assert(!(dba_bg == acc_meth1 || dba_mm == acc_meth1) || (NULL != gvt1->gd_csa));
|
|
|
|
assert(!(dba_bg == acc_meth2 || dba_mm == acc_meth2) || (NULL != gvt2->gd_csa));
|
|
|
|
/* if (!(both are bg/mm regions && dbs are same && same global) &&
|
|
|
|
* !(both are cm regions && on the same remote node && same region)
|
|
|
|
* !(both are usr regions && in the same volume set))
|
|
|
|
* NO DESCENDANTS
|
|
|
|
* endif
|
|
|
|
*/
|
|
|
|
if (!(((dba_bg == acc_meth1 || dba_mm == acc_meth2) && (dba_bg == acc_meth1 || dba_mm == acc_meth2))
|
|
|
|
&& (gvt1->gd_csa == gvt2->gd_csa) && (gvt1->root == gvt2->root))
|
|
|
|
&& !((dba_cm == acc_meth1) && (dba_cm == acc_meth2)
|
|
|
|
&& (reg1->dyn.addr->cm_blk == reg2->dyn.addr->cm_blk) && (reg1->cmx_regnum == reg2->cmx_regnum))
|
|
|
|
VMS_ONLY (&&
|
|
|
|
!((dba_usr == acc_meth1) && (dba_usr == acc_meth2)
|
|
|
|
&& ((ddp_info *)(&FILE_INFO(reg1)->file_id))->volset == ((ddp_info *)(&FILE_INFO(reg2)->file_id))->volset)))
|
|
|
|
{
|
|
|
|
UNIX_ONLY(assert(dba_usr != acc_meth1 && dba_usr != acc_meth2);)
|
2012-03-24 14:06:46 -04:00
|
|
|
return 1;
|
2012-02-05 11:35:58 -05:00
|
|
|
}
|
|
|
|
if (0 == memcmp(mglvnp->gblp[IND1]->s_gv_currkey->base, mglvnp->gblp[IND2]->s_gv_currkey->base,
|
|
|
|
MIN(mglvnp->gblp[IND1]->s_gv_currkey->end, mglvnp->gblp[IND2]->s_gv_currkey->end)))
|
|
|
|
{
|
2012-03-24 14:06:46 -04:00
|
|
|
if (mglvnp->gblp[IND1]->s_gv_currkey->end == mglvnp->gblp[IND2]->s_gv_currkey->end)
|
|
|
|
return 0; /* NOOP - merge self */
|
2012-02-05 11:35:58 -05:00
|
|
|
if (0 == (end1 = format_targ_key(buff1, MAX_ZWR_KEY_SZ, mglvnp->gblp[IND1]->s_gv_currkey, TRUE)))
|
|
|
|
end1 = &buff1[MAX_ZWR_KEY_SZ - 1];
|
|
|
|
if (0 == (end2 = format_targ_key(buff2, MAX_ZWR_KEY_SZ, mglvnp->gblp[IND2]->s_gv_currkey, TRUE)))
|
|
|
|
end2 = &buff2[MAX_ZWR_KEY_SZ - 1];
|
|
|
|
if (mglvnp->gblp[IND1]->s_gv_currkey->end > mglvnp->gblp[IND2]->s_gv_currkey->end)
|
|
|
|
rts_error(VARLSTCNT(6) ERR_MERGEDESC, 4, end1 - buff1, buff1, end2 - buff2, buff2);
|
|
|
|
else
|
|
|
|
rts_error(VARLSTCNT(6) ERR_MERGEDESC, 4, end2 - buff2, buff2, end1 - buff1, buff1);
|
|
|
|
}
|
|
|
|
} else if (MARG1_IS_LCL(merge_args) && MARG2_IS_LCL(merge_args))
|
|
|
|
{
|
2012-03-24 14:06:46 -04:00
|
|
|
if (mglvnp->lclp[IND1] == mglvnp->lclp[IND2])
|
|
|
|
return 0; /* NOOP - merge self */
|
2012-02-05 11:35:58 -05:00
|
|
|
if (lcl_arg1_is_desc_of_arg2(mglvnp->lclp[IND1], mglvnp->lclp[IND2]))
|
|
|
|
{
|
|
|
|
end1 = format_key_lv_val(mglvnp->lclp[IND1], buff1, SIZEOF(buff1));
|
|
|
|
end2 = format_key_lv_val(mglvnp->lclp[IND2], buff2, SIZEOF(buff2));
|
|
|
|
rts_error(VARLSTCNT(6) ERR_MERGEDESC, 4, end1 - buff1, buff1, end2 - buff2, buff2);
|
|
|
|
} else if (lcl_arg1_is_desc_of_arg2(mglvnp->lclp[IND2], mglvnp->lclp[IND1]))
|
|
|
|
{
|
|
|
|
end1 = format_key_lv_val(mglvnp->lclp[IND1], buff1, SIZEOF(buff1));
|
|
|
|
end2 = format_key_lv_val(mglvnp->lclp[IND2], buff2, SIZEOF(buff2));
|
|
|
|
rts_error(VARLSTCNT(6) ERR_MERGEDESC, 4, end2 - buff2, buff2, end1 - buff1, buff1);
|
|
|
|
}
|
|
|
|
}
|
2012-03-24 14:06:46 -04:00
|
|
|
return 1;
|
2012-02-05 11:35:58 -05:00
|
|
|
}
|