114 lines
3.0 KiB
C
114 lines
3.0 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2001, 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 "gdsblk.h"
|
|
#include "gtm_facility.h"
|
|
#include "fileinfo.h"
|
|
#include "gdsbt.h"
|
|
#include "gdsfhead.h"
|
|
#include "rc.h"
|
|
#include "copy.h"
|
|
#include "error.h"
|
|
#include "gtcm.h"
|
|
#include "gvcst_protos.h" /* for gvcst_put prototype */
|
|
|
|
GBLREF gv_key *gv_currkey;
|
|
GBLREF gv_namehead *gv_target;
|
|
GBLREF int rc_set_fragment;
|
|
GBLREF gd_region *gv_cur_region;
|
|
GBLREF gd_addr *gd_header;
|
|
|
|
int rc_prc_setf(rc_q_hdr *qhdr)
|
|
{
|
|
rc_set *req, *rsp;
|
|
short data_off, str_remain, *ptr;
|
|
char *cp1;
|
|
int i;
|
|
mval v;
|
|
|
|
ESTABLISH_RET(rc_dbms_ch, RC_SUCCESS);
|
|
if ((qhdr->a.erc.value = rc_fnd_file(&qhdr->r.xdsid)) != RC_SUCCESS)
|
|
{
|
|
REVERT;
|
|
#ifdef DEBUG
|
|
gtcm_cpktdmp((char *)qhdr,qhdr->a.len.value,"rc_fnd_file failed.");
|
|
#endif
|
|
return -1;
|
|
}
|
|
rsp = req = (rc_set *)qhdr;
|
|
v.mvtype = MV_STR;
|
|
for (cp1 = req->key.key; *cp1; cp1++)
|
|
;
|
|
v.str.len = INTCAST(cp1 - req->key.key);
|
|
v.str.addr = req->key.key;
|
|
if (v.str.len > 8) /* GT.M does not support global variables > 8 chars */
|
|
{ qhdr->a.erc.value = RC_KEYTOOLONG;
|
|
REVERT;
|
|
#ifdef DEBUG
|
|
gtcm_cpktdmp((char *)qhdr,qhdr->a.len.value,"RC_KEYTOOLONG.");
|
|
#endif
|
|
return -1;
|
|
}
|
|
GV_BIND_NAME_AND_ROOT_SEARCH(gd_header, &v.str);
|
|
memcpy(gv_currkey->base, req->key.key, req->key.len.value);
|
|
gv_currkey->end = req->key.len.value;
|
|
gv_currkey->base[gv_currkey->end] = 0;
|
|
for (i = gv_currkey->end - 2; i > 0; i--)
|
|
if (!gv_currkey->base[i - 1])
|
|
break;
|
|
gv_currkey->prev = i;
|
|
|
|
ptr = (short*)(req->key.key + req->key.len.value);
|
|
GET_SHORT(v.str.len, ptr);
|
|
ptr++;
|
|
GET_SHORT(data_off ,ptr);
|
|
ptr++;
|
|
GET_SHORT(str_remain ,ptr);
|
|
ptr++;
|
|
if (gv_currkey->end + 1 + v.str.len + SIZEOF(rec_hdr) > gv_cur_region->max_rec_size)
|
|
{
|
|
qhdr->a.erc.value = RC_KEYTOOLONG;
|
|
#ifdef DEBUG
|
|
gtcm_cpktdmp((char *)qhdr,qhdr->a.len.value,"RC_KEYTOOLONG.");
|
|
#endif
|
|
}
|
|
else /* the total record will fit into a block */
|
|
{
|
|
if (rc_set_fragment = data_off) /* just send fragment */
|
|
{
|
|
v.str.len = v.str.len - data_off - str_remain;
|
|
v.str.addr = (char*)ptr;
|
|
}
|
|
else /* first fragment, put whole record, with zero filler */
|
|
{
|
|
v.str.addr = (char*)malloc(v.str.len);
|
|
memset(v.str.addr, 0, v.str.len);
|
|
memcpy(v.str.addr + data_off, ptr, v.str.len - data_off - str_remain);
|
|
}
|
|
v.mvtype = MV_STR;
|
|
gvcst_put(&v);
|
|
|
|
if (rc_set_fragment)
|
|
rc_set_fragment = 0;
|
|
else
|
|
free(v.str.addr);
|
|
}
|
|
|
|
REVERT;
|
|
return ((qhdr->a.erc.value == RC_SUCCESS) ? 0 : -1);
|
|
|
|
}
|