184 lines
5.4 KiB
C
184 lines
5.4 KiB
C
|
/****************************************************************
|
||
|
* *
|
||
|
* Copyright 2003, 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 "gdsroot.h"
|
||
|
#include "gdsbt.h"
|
||
|
#include "gtm_facility.h"
|
||
|
#include "fileinfo.h"
|
||
|
#include "gdsfhead.h"
|
||
|
#include "filestruct.h"
|
||
|
#include "jnl.h"
|
||
|
#include "buddy_list.h"
|
||
|
#include "hashtab_int4.h" /* needed for muprec.h */
|
||
|
#include "hashtab_int8.h" /* needed for muprec.h */
|
||
|
#include "hashtab_mname.h" /* needed for muprec.h */
|
||
|
#include "muprec.h"
|
||
|
#include "copy.h"
|
||
|
#include "min_max.h"
|
||
|
#include "format_targ_key.h"
|
||
|
#include "jnl_typedef.h"
|
||
|
#include "iosp.h" /* for SS_NORMAL */
|
||
|
#include "real_len.h" /* for real_len() prototype */
|
||
|
|
||
|
GBLREF mur_opt_struct mur_options;
|
||
|
|
||
|
boolean_t mur_select_rec(jnl_ctl_list *jctl)
|
||
|
{
|
||
|
boolean_t exc_item_seen, inc_item_seen, inc_seen, wildcard_match;
|
||
|
char key_buff[MAX_KEY_SZ + 1 + SIZEOF(uint4) * 2], asc_key_buff[MAX_ZWR_KEY_SZ], *ptr;
|
||
|
int i, key_len, pat_pos, subs_pos;
|
||
|
uint4 pini_addr;
|
||
|
gv_key *key;
|
||
|
jnl_record *rec;
|
||
|
pini_list_struct *plst;
|
||
|
jnl_process_vector *pv;
|
||
|
enum jnl_record_type rectype;
|
||
|
long_list *ll_ptr;
|
||
|
select_list *sl_ptr;
|
||
|
jnl_string *keystr;
|
||
|
uint4 status;
|
||
|
int4 pv_len, sl_len;
|
||
|
|
||
|
assert(mur_options.selection);
|
||
|
rec = jctl->reg_ctl->mur_desc->jnlrec;
|
||
|
rectype = (enum jnl_record_type)rec->prefix.jrec_type;
|
||
|
pini_addr = rec->prefix.pini_addr;
|
||
|
key = NULL;
|
||
|
if (JRT_NULL == rectype || JRT_ALIGN == rectype)
|
||
|
return TRUE;
|
||
|
status = mur_get_pini(jctl, pini_addr, &plst);
|
||
|
if (SS_NORMAL != status)
|
||
|
return TRUE;
|
||
|
pv = &plst->jpv;
|
||
|
if (IS_SET_KILL_ZKILL_ZTRIG(rectype))
|
||
|
{ /* Translate internal format of jnl_record key to ascii */
|
||
|
keystr = (jnl_string *)&rec->jrec_set_kill.mumps_node;
|
||
|
key = (gv_key *)key_buff;
|
||
|
key->top = MAX_KEY_SZ;
|
||
|
key->end = keystr->length;
|
||
|
assert(key->end <= key->top);
|
||
|
memcpy(key->base, &keystr->text[0], keystr->length);
|
||
|
key->base[key->end] = '\0';
|
||
|
key_len = INTCAST((format_targ_key((uchar_ptr_t)asc_key_buff, MAX_ZWR_KEY_SZ, key, FALSE) -
|
||
|
(unsigned char *)asc_key_buff));
|
||
|
}
|
||
|
/* Check this record against the various selection lists */
|
||
|
if (NULL != mur_options.user)
|
||
|
{
|
||
|
inc_seen = inc_item_seen = exc_item_seen = FALSE;
|
||
|
for (sl_ptr = mur_options.user; NULL != sl_ptr; sl_ptr = sl_ptr->next)
|
||
|
{
|
||
|
wildcard_match = FALSE;
|
||
|
if (!sl_ptr->exclude)
|
||
|
inc_seen = TRUE;
|
||
|
if (sl_ptr->has_wildcard)
|
||
|
wildcard_match = mur_do_wildcard(pv->jpv_user, sl_ptr->buff, JPV_LEN_USER, sl_ptr->len);
|
||
|
if (!wildcard_match)
|
||
|
{
|
||
|
pv_len = real_len(JPV_LEN_USER, (uchar_ptr_t)pv->jpv_user);
|
||
|
sl_len = MIN(sl_ptr->len, JPV_LEN_USER);
|
||
|
}
|
||
|
if (wildcard_match || (pv_len == sl_len) && (0 == memcmp(pv->jpv_user, sl_ptr->buff, sl_len)))
|
||
|
{
|
||
|
if (sl_ptr->exclude)
|
||
|
exc_item_seen = TRUE;
|
||
|
else
|
||
|
inc_item_seen = TRUE;
|
||
|
}
|
||
|
}
|
||
|
if (exc_item_seen || (inc_seen && !inc_item_seen))
|
||
|
return FALSE;
|
||
|
}
|
||
|
if ((NULL != mur_options.global) && (NULL != key))
|
||
|
{
|
||
|
inc_seen = inc_item_seen = exc_item_seen = FALSE;
|
||
|
for (sl_ptr = mur_options.global; NULL != sl_ptr; sl_ptr = sl_ptr->next)
|
||
|
{
|
||
|
wildcard_match = FALSE;
|
||
|
if (!sl_ptr->exclude)
|
||
|
inc_seen = TRUE;
|
||
|
if (sl_ptr->has_wildcard)
|
||
|
wildcard_match = mur_do_wildcard(asc_key_buff, sl_ptr->buff, key_len, sl_ptr->len);
|
||
|
i = sl_ptr->len;
|
||
|
if (sl_ptr->buff[i - 1] == ')')
|
||
|
--i;
|
||
|
if (wildcard_match
|
||
|
|| (key_len == i) && (0 == memcmp(asc_key_buff, sl_ptr->buff, i))
|
||
|
|| (key_len > i) && (0 == memcmp(asc_key_buff, sl_ptr->buff, i))
|
||
|
&& (('(' == asc_key_buff[i]) || (')' == asc_key_buff[i]) || (',' == asc_key_buff[i])))
|
||
|
{
|
||
|
if (sl_ptr->exclude)
|
||
|
exc_item_seen = TRUE;
|
||
|
else
|
||
|
inc_item_seen = TRUE;
|
||
|
}
|
||
|
}
|
||
|
if (exc_item_seen || (inc_seen && !inc_item_seen))
|
||
|
return FALSE;
|
||
|
}
|
||
|
if (NULL != mur_options.process)
|
||
|
{
|
||
|
inc_seen = inc_item_seen = exc_item_seen = FALSE;
|
||
|
for (sl_ptr = mur_options.process; NULL != sl_ptr; sl_ptr = sl_ptr->next)
|
||
|
{
|
||
|
wildcard_match = FALSE;
|
||
|
if (!sl_ptr->exclude)
|
||
|
inc_seen = TRUE;
|
||
|
if (sl_ptr->has_wildcard)
|
||
|
wildcard_match = mur_do_wildcard(pv->jpv_prcnam, sl_ptr->buff, JPV_LEN_PRCNAM, sl_ptr->len);
|
||
|
if (!wildcard_match)
|
||
|
{
|
||
|
pv_len = real_len(JPV_LEN_PRCNAM, (uchar_ptr_t)pv->jpv_prcnam);
|
||
|
sl_len = MIN(sl_ptr->len, JPV_LEN_PRCNAM);
|
||
|
}
|
||
|
if (wildcard_match || (pv_len == sl_len) && (0 == memcmp(pv->jpv_prcnam, sl_ptr->buff, sl_len)))
|
||
|
{
|
||
|
if (sl_ptr->exclude)
|
||
|
exc_item_seen = TRUE;
|
||
|
else
|
||
|
inc_item_seen = TRUE;
|
||
|
}
|
||
|
}
|
||
|
if (exc_item_seen || (inc_seen && !inc_item_seen))
|
||
|
return FALSE;
|
||
|
}
|
||
|
if (NULL != mur_options.id)
|
||
|
{
|
||
|
inc_seen = inc_item_seen = exc_item_seen = FALSE;
|
||
|
for (ll_ptr = mur_options.id; NULL != ll_ptr; ll_ptr = ll_ptr->next)
|
||
|
{
|
||
|
if (!ll_ptr->exclude)
|
||
|
inc_seen = TRUE;
|
||
|
if (ll_ptr->num == pv->jpv_pid)
|
||
|
{
|
||
|
if (ll_ptr->exclude)
|
||
|
exc_item_seen = TRUE;
|
||
|
else
|
||
|
inc_item_seen = TRUE;
|
||
|
}
|
||
|
}
|
||
|
if (exc_item_seen || (inc_seen && !inc_item_seen))
|
||
|
return FALSE;
|
||
|
}
|
||
|
if (IS_SET_KILL_ZKILL_ZTRIG(rectype))
|
||
|
{
|
||
|
if (IS_SET(rectype))
|
||
|
return mur_options.transaction != TRANS_KILLS;
|
||
|
else
|
||
|
return mur_options.transaction != TRANS_SETS;
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|