Retrieve the complete LOB parameter data at once using srv_xferdata or in chunks using the new srv_get_data routine.
Open Server retrieves LOB parameters in chunks when the parameter length has been set to CS_UNUSED. See srv_get_data.
/*
** Retrieve the description of the parameters coming
** from client
*/
for (paramnum = 1; paramnum <= numparams; paramnum++)
{
/*
** Get a description of the parameter.
*/
ret = srv_descfmt(spp, CS_GET, SRV_RPCDATA,
paramnum, &(paramfmtp[paramnum - 1]));
/*
** Allocate space for the parameters and bind the
** data.
*/
if (paramfmtp[paramnum-1].maxlength >= 0)
{
if (paramfmtp[paramnum-1].maxlength > 0)
{
data[paramnum-1] = calloc(1,
paramfmtp[paramnum-1].maxlength);
}
else
{
ind[paramnum-1] = CS_NULLDATA;
}
}
else
{
/*
** Allocate a large size buffer for BLOB data
** (which length is unknown yet)
*/
blobbuf[blobnum] = malloc(BUFSIZE);
blobnum++;
}
srv_bind(spp, CS_GET, SRV_RPCDATA, paramnum,
&(paramfmtp[paramnum-1]), data[paramnum-1],
&(len[paramnum-1]), &(ind[paramnum-1]))
/*
** For every LOB parameter, call srv_get_data() in
** a loop as long as it succeeds
/*
for (i = 0; i < blobnum ; i++)
{
bufp = blobbuf[i];
bloblen[i] = 0;
do
{
ret = srv_get_data(spp, bufp, BUFSIZE,
&outlen);
bufp += outlen;
bloblen[i] += outlen;
} while (ret == CS_SUCCEED);
/*
** Check for the correct return code
*/
if (ret != CS_END_DATA)
{
return CS_FAIL;
}
}
/*
** And receive remaining client data srv_xferdata()
*/
ret = srv_xferdata(spp, CS_GET, SRV_RPCDATA);
}