Open Server can retrieve the complete large object (LOB) parameter data at the same time using srv_xferdata(), or in chunks using srv_get_data. Open Server retrieves LOB parameters in chunks when the parameter length has been set to CS_UNUSED. See “srv_get_data”.
Retrieves description of LOB parameters:
/* ** 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); }