107 lines
3.0 KiB
C
107 lines
3.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. *
|
|
* *
|
|
****************************************************************/
|
|
|
|
#include "mdef.h"
|
|
|
|
#include "gtm_string.h"
|
|
#include "gdsroot.h"
|
|
#include "gtm_facility.h"
|
|
#include "fileinfo.h"
|
|
#include "gdsbt.h"
|
|
#include "gdsfhead.h"
|
|
#include "min_max.h"
|
|
#include "mlk_region_lookup.h"
|
|
#include "targ_alloc.h"
|
|
#include "hashtab_mname.h"
|
|
|
|
#define DIR_ROOT 1
|
|
|
|
gd_region *mlk_region_lookup(mval *ptr, gd_addr *addr)
|
|
{
|
|
ht_ent_mname *tabent;
|
|
mname_entry gvent;
|
|
gd_binding *map;
|
|
gv_namehead *targ;
|
|
gd_region *reg;
|
|
register char *p;
|
|
int res, plen;
|
|
boolean_t added;
|
|
enum db_acc_method acc_meth;
|
|
gvnh_reg_t *gvnh_reg;
|
|
|
|
p = ptr->str.addr;
|
|
plen = ptr->str.len;
|
|
if (*p != '^') /* is local lock */
|
|
{
|
|
reg = addr->maps->reg.addr; /* local lock map is first */
|
|
if (!reg->open)
|
|
gv_init_reg (reg);
|
|
} else
|
|
{
|
|
p++;
|
|
plen--;
|
|
gvent.var_name.addr = p;
|
|
gvent.var_name.len = MIN(plen, MAX_MIDENT_LEN);
|
|
COMPUTE_HASH_MNAME(&gvent);
|
|
if ((NULL != (tabent = lookup_hashtab_mname(addr->tab_ptr, &gvent)))
|
|
&& (NULL != (gvnh_reg = (gvnh_reg_t *)tabent->value)))
|
|
{
|
|
targ = gvnh_reg->gvt;
|
|
reg = gvnh_reg->gd_reg;
|
|
if (!reg->open)
|
|
{
|
|
targ->clue.end = 0;
|
|
gv_init_reg(reg);
|
|
}
|
|
} else
|
|
{
|
|
map = addr->maps + 1; /* get past local locks */
|
|
for (; (res = memcmp(gvent.var_name.addr, &(map->name[0]), gvent.var_name.len)) >= 0; map++)
|
|
{
|
|
assert (map < addr->maps + addr->n_maps);
|
|
if (0 == res && 0 != map->name[gvent.var_name.len])
|
|
break;
|
|
}
|
|
reg = map->reg.addr;
|
|
if (!reg->open)
|
|
gv_init_reg (reg);
|
|
acc_meth = reg->dyn.addr->acc_meth;
|
|
if ((dba_cm == acc_meth) || (dba_usr == acc_meth))
|
|
{
|
|
targ = malloc(SIZEOF(gv_namehead) + gvent.var_name.len);
|
|
memset(targ, 0, SIZEOF(gv_namehead) + gvent.var_name.len);
|
|
targ->gvname.var_name.addr = (char *)targ + SIZEOF(gv_namehead);
|
|
targ->nct = 0;
|
|
targ->collseq = NULL;
|
|
targ->regcnt = 1;
|
|
memcpy(targ->gvname.var_name.addr, gvent.var_name.addr, gvent.var_name.len);
|
|
targ->gvname.var_name.len = gvent.var_name.len;
|
|
targ->gvname.hash_code = gvent.hash_code;
|
|
} else
|
|
targ = (gv_namehead *)targ_alloc(reg->max_key_size, &gvent, reg);
|
|
gvnh_reg = (gvnh_reg_t *)malloc(SIZEOF(gvnh_reg_t));
|
|
gvnh_reg->gvt = targ;
|
|
gvnh_reg->gd_reg = reg;
|
|
if (NULL != tabent)
|
|
{ /* Since the global name was found but gv_target was null and now we created a new targ,
|
|
* the hash table key must point to the newly created targ->gvname. */
|
|
tabent->key = targ->gvname;
|
|
tabent->value = (char *)gvnh_reg;
|
|
} else
|
|
{
|
|
added = add_hashtab_mname((hash_table_mname *)addr->tab_ptr, &targ->gvname, gvnh_reg, &tabent);
|
|
assert(added);
|
|
}
|
|
}
|
|
}
|
|
return reg;
|
|
}
|