cs_locator

Description

Retrieves information from a CS_LOCATOR variable, such as prefetched data, the total length of the LOB in the server, or the character representation of the locator pointer.

Syntax

CS_RETCODE cs_locator(ctx, action, locator, type, 
    buffer, buflen, outlen)

CS_CONTEXT        *ctx;
CS_INT                    action;
CS_LOCATOR        *locator;
CS_INT                    type;
CS_VOID                *buffer;
CS_INT                   buflen;
CS_INT                 *outlen;

Parameters

ctx

A pointer to a CS_CONTEXT structure.

action

Specifies whether to set or retrieve information. Currently, the only action allowed is CS_GET.

locator

Pointer to the locator variable.

type

Type of information to retrieve or set. Symbolic values:

Value

Action

*buffer points to

Description

CS_LCTR_LOBLEN

CS_GET

CS_BIGINT

Retrieves the total length of the LOB data in the server.

CS_LCTR_LOCATOR

CS_GET

CS_CHAR

Retrieves the locator value as a character string.

CS_LCTR_PREFETCHLEN

CS_GET

CS_INT

Retrieves the length of the prefetched LOB data contained in the locator variable.

CS_LCTR_PREFETCHDATA

CS_GET

CS_CHAR

Retrieves the prefetched LOB data contained in the locator variable.

CS_LCTR_DATATYPE

CS_GET

CS_INT

Retrieves the locator type. Valid return types are CS_TEXTLOCATOR_TYPE, CS_IMAGELOCATOR_TYPE, and CS_UNITEXTLOCATOR_TYPE.

buffer

A pointer to the variable in which to store. Character data is NULL terminated.

buflen

*buffer length, in bytes.

outlen

A pointer to a CS_INT variable. If outlen is not NULL, cs_locator() sets *outlen to the length, in bytes, of the data placed in *buffer. If the data returned is a character data (for example, a prefetched data or locator string), the length returned in *outlen includes the NULL terminator. If cs_locator() returns CS_TRUNCATED and outlen is not NULL, cs_locator() returns the required buffer size in *outlen.

Returns

Return value

Meaning

CS_SUCCEED

The routine completed successfully.

CS_TRUNCATED

The result has been truncated because the buffer is too small.

CS_FAIL

The routine failed.

Examples

Example 1

Retrieves the LOB locator for a text value that needs to be truncated. See the Open Client Client-Library/C Reference Manual for more code examples.

CS_LOCATOR *lobloc;
CS_INT     prefetchsize;
CS_BOOL    boolval;
CS_INT     start, length;
CS_INT     outlen;
CS_CHAR    charbuf[1024];
CS_BIGINT  totallen;
...

/*
** Turn on option CS_LOBLOCATOR first and set the prefetchsize to 100.
*/boolval = CS_TRUE;
ct_options(conn, CS_SET, CS_OPT_LOBLOCATOR, &boolval, CS_UNUSED, NULL);
prefetchsize = 100;
ct_options(conn, CS_SET, CS_OPT_LOBPREFETCHSIZE, \
    &prefetchsize, CS_UNUSED, NULL);

/*
** Allocate memory for the CS_LOCATOR.
*/
cs_locator_alloc(ctx, &lobloc);

/*
** Open a transaction and get the locator. The locator is only valid within a
** transaction.
*/
sprintf(cmdbuf, "begin transaction \
   select au_id, copy from pubs2..blurbs where au_id \
   like ‘486-29-%’");
ct_command(cmd, CS_LANG_CMD, cmdbuf , CS_NULLTERM, CS_UNUSED);
ct_send(cmd);

/*
** Process results.
*/
while ((results_ret = ct_results(...)) == CS_SUCCEED)
{
   ...}
   /*
   ** Bind the locator and fetch it.
   */
   strcpy(prmfmt.name, "@locatorparam");
   prmfmt.namelen = CS_NULLTERM;
   prmfmt.datatype = CS_TEXTLOCATOR_TYPE;
   prmfmt.maxlength = CS_UNUSED;
   ...

   ct_bind(cmd, 1, &fmt, lobloc, NULL, &indicator);
   ct_fetch(cmd, CS_UNUSED, CS_UNUSED, CS_UNUSED, &count);
}

/*
** Use the cs_locator() routine to retrieve data from the fetched locator. 
** Get the prefetch length and the prefetch data.
*/
cs_locator(ctx, CS_GET, lobloc, CS_LCTR_PREFETCHLEN, \
   (CS_VOID *)&prefetchsize, sizeof(CS_INT), &outlen);

cs_locator(ctx, CS_GET, lobloc, CS_LCTR_PREFETCHDATA, \
   (CS_VOID *)charbuf, sizeof(charbuf), &outlen);

/*
** Retrieve the total length of the LOB data in the server for this
** locator.
*/
cs_locator(ctx, CS_GET, lobloc, CS_LCTR_LOBLEN, \
   (CS_VOID *)&totallen,
   sizeof(totallen), &outlen);

/*
** Use the retrieved locator to perform an action to the LOB, pointed to by
** this locator in the server. 
**
** Get a substring from the text in the server, using a parameterized 
** language command.
*/
start = 10;
length = 20;
sprintf(cmdbuf, "select return_lob(text, substring(@locatorparam, \
   start, length))");
ct_command(cmd, CS_LANG_CMD, cmdbuf, CS_NULLTERM, CS_UNUSED);

/*
** Set the format structure and call ct_param()
*/
strcpy(prmfmt.name, "@locatorparam");
prmfmt.namelen = CS_NULLTERM;
prmfmt.datatype = CS_TEXTLOCATOR_TYPE;
prmfmt.format = CS_FMT_UNUSED;
prmfmt.maxlength = CS_UNUSED;
prmfmt.status = CS_INPUTVALUE;

indicator = 0;
ct_param(cmd, &prmfmt, (CS_VOID *)lobloc, CS_UNUSED, indicator);

/*
** Send the locator commands to the server.
*/
ct_send(cmd);

/*
** Process results.
*/
while ((results_ret = ct_results(...)) == CS_SUCCEED)
{
   ...
}

/*
** Truncate the text to 20 bytes and commit the transaction.
*/
sprintf(cmdbuf, "truncate lob @locatorparam (length) \
   commit transaction");
ct_command(cmd, CS_LANG_CMD, cmdbuf, CS_NULLTERM, CS_UNUSED);
ct_param(cmd, &prmfmt, (CS_VOID *)lobloc, CS_UNUSED, indicator);

ct_send(cmd);

/*
** Process results.
*/
while ((results_ret = ct_results(...)) == CS_SUCCEED) 
{
   ...
}

/*
** The transaction is closed, deallocate the locator.
*/
cs_locator_drop(ctx, lobloc);

See also

cs_locator_alloc, cs_locator_drop