93 lines
2.9 KiB
C
93 lines
2.9 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2001, 2012 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 "copy.h"
|
|
#include "gdsroot.h"
|
|
#include "gtm_facility.h"
|
|
#include "fileinfo.h"
|
|
#include "gdsbt.h"
|
|
#include "gdsfhead.h"
|
|
#include "cmidef.h"
|
|
#include "hashtab_mname.h" /* needed for cmmdef.h */
|
|
#include "cmmdef.h"
|
|
#include "gtcmd.h"
|
|
#include "gtcm_add_region.h"
|
|
#include "gtcmtr_protos.h"
|
|
|
|
GBLREF connection_struct *curr_entry;
|
|
|
|
error_def(ERR_UNIMPLOP);
|
|
error_def(ERR_TEXT);
|
|
error_def(ERR_GVIS);
|
|
|
|
bool gtcmtr_initreg(void)
|
|
{
|
|
cm_region_head *region;
|
|
cm_region_list *list_entry;
|
|
unsigned char *reply;
|
|
unsigned short temp_short;
|
|
unsigned char buff[MAX_ZWR_KEY_SZ], *end;
|
|
|
|
assert(*curr_entry->clb_ptr->mbf == CMMS_S_INITREG);
|
|
region = gtcmd_ini_reg(curr_entry);
|
|
gtcm_add_region(curr_entry,region);
|
|
|
|
if (region->reg->max_rec_size > 32767)
|
|
{
|
|
rts_error(VARLSTCNT(10) ERR_UNIMPLOP, 0,
|
|
ERR_TEXT, 2,
|
|
LEN_AND_LIT("Client does not support spanning nodes"),
|
|
ERR_TEXT, 2, DB_LEN_STR(region->reg));
|
|
}
|
|
|
|
if (region->reg->max_rec_size + CM_BUFFER_OVERHEAD > curr_entry->clb_ptr->mbl)
|
|
{
|
|
free(curr_entry->clb_ptr->mbf);
|
|
curr_entry->clb_ptr->mbf = (unsigned char *)malloc(region->reg->max_rec_size + CM_BUFFER_OVERHEAD);
|
|
curr_entry->clb_ptr->mbl = region->reg->max_rec_size + CM_BUFFER_OVERHEAD;
|
|
}
|
|
if (0 == curr_entry->cli_supp_allowexisting_stdnullcoll)
|
|
{
|
|
if (ALLOWEXISTING == region->reg->null_subs)
|
|
{
|
|
rts_error(VARLSTCNT(10) ERR_UNIMPLOP, 0,
|
|
ERR_TEXT, 2,
|
|
LEN_AND_LIT("Client does not support ALLOWEXISTING for null subscripts"),
|
|
ERR_TEXT, 2, DB_LEN_STR(region->reg));
|
|
}
|
|
if ( 0 != region->reg->std_null_coll)
|
|
{
|
|
rts_error(VARLSTCNT(10) ERR_UNIMPLOP, 0,
|
|
ERR_TEXT, 2,
|
|
LEN_AND_LIT("Client does not support standard null collation for null subscripts"),
|
|
ERR_TEXT, 2, DB_LEN_STR(region->reg));
|
|
}
|
|
}
|
|
|
|
reply = curr_entry->clb_ptr->mbf;
|
|
*reply++ = CMMS_T_REGNUM;
|
|
*reply++ = curr_entry->current_region->regnum;
|
|
*reply++ = region->reg->null_subs;
|
|
temp_short = (unsigned short)region->reg->max_rec_size;
|
|
assert((int4)temp_short == region->reg->max_rec_size); /* ushort <- int4 assignment lossy? */
|
|
PUT_USHORT(reply, temp_short);
|
|
reply += SIZEOF(unsigned short);
|
|
temp_short = (unsigned short)region->reg->max_key_size;
|
|
assert((int4)temp_short == region->reg->max_key_size); /* ushort <- int4 assignment lossy? */
|
|
PUT_USHORT(reply, temp_short);
|
|
reply += SIZEOF(unsigned short);
|
|
if (curr_entry->cli_supp_allowexisting_stdnullcoll)
|
|
*reply++ = region->reg->std_null_coll;
|
|
curr_entry->clb_ptr->cbl = reply - curr_entry->clb_ptr->mbf;
|
|
return TRUE;
|
|
}
|