xp_echo.c has an ESP that accepts a user-supplied input parameter and echoes it to the ESP client, which is the process invoking the ESP. This example includes the xp_message function, which sends messages and status, and the xp_echo function which processes the input parameter and performs the echoing. You can use this example as a template for building your own ESP functions. The source is in $SYBASE/$SYBASE_ASE/sample/esp.
/*
** xp_echo.c
**
** Description:
** The following sample program is generic in
** nature. It echoes an input string which is
** passed as the first parameter to the xp_echo
** ESP. This string is retrieved into a buffer
** and then sent back (echoed) to the ESP client.
*/
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
/* Required Open Server include files.*/
#include <ospublic.h>
#include <oserror.h>
/*
** Constant defining the length of the buffer that receives the
** input string. All of the parameters related
** to ESP may not exceed 255 char long.
*/
#define ECHO_BUF_LEN 255
/*
** Function:
** xp_message
** Purpose: Sends information, status and completion of the
** command to the server.
** Input:
** SRV_PROC *
** char * a message string.
** Output:
** void
*/
void xp_message
(
SRV_PROC *srvproc, /* Pointer to Open Server thread
control structure */
char *message_string /* Input message string */
)
{
/*
** Declare a variable that will contain information
** about the message being sent to the SQL client.
*/
CS_SERVERMSG *errmsgp;
/*
** A SRV_DONE_MORE instead of a SRV_DONE_FINAL must
** complete the result set of an Extended Stored
** Procedure.
*/
srv_senddone(srvproc, SRV_DONE_MORE, 0, 0);
free(errmsgp);
}
/*
** Function: xp_echo
** Purpose:
** Given an input string, this string is echoed as an output
** string to the corresponding SQL (ESP) client.
** Input:
** SRV_PROC *
** Output
** SUCCESS or FAILURE
*/
CS_RETCODE xp_echo
(
SRV_PROC *srvproc
)
{
CS_INT paramnum; /* number of parameters */
CS_CHAR echo_str_buf[ECHO_BUF_LEN + 1];
/* buffer to hold input string */
CS_RETCODE result = CS_SUCCEED;
CS_DATAFMT paramfmt; /* input/output param format */
CS_INT len; /* Length of input param */
CS_SMALLINT outlen;
/*
** Get number of input parameters.*/
*/
srv_numparams(srvproc, ¶mnum);
/*
** Only one parameter is expected.*/
*/
if (paramnum != 1)
{
/*
** Send a usage error message.*/
*/
xp_message(srvproc, "Invalid number of
parameters");
result = CS_FAIL;
}
else
{
/*
** Perform initializations.
*/
outlen = CS_GOODDATA;
memset(¶mfmt, (CS_INT)0,
(CS_INT)sizeof(CS_DATAFMT));
/*
** We are receiving data through an ESP as the
** first parameter. So describe this expected
** parameter.
*/
if ((result == CS_SUCCEED) &&
srv_descfmt(srvproc, CS_GET
SRV_RPCDATA, 1, ¶mfmt) != CS_SUCCEED)
{
result = CS_FAIL;
}
/*
** Describe and bind the buffer to receive the
** parameter.
*/
if ((result == CS_SUCCEED) &&
(srv_bind(srvproc, CS_GET, SRV_RPCDATA,
1, ¶mfmt,(CS_BYTE *) echo_str_buf,
&len, &outlen) != CS_SUCCEED))
{
result = CS_FAIL;
}
/* Receive the expected data.*/
if ((result == CS_SUCCEED) &&
srv_xferdata(srvproc,CS_GET,SRV_RPCDATA)
!= CS_SUCCEED)
{
result = CS_FAIL;
} /*
** Now we have the input info and are ready to
** send the output info.
*/
if (result == CS_SUCCEED)
{
/*
** Perform initialization.
*/
if (len == 0)
outlen = CS_NULLDATA;
else
outlen = CS_GOODDATA;
memset(¶mfmt, (CS_INT)0,
(CS_INT)sizeof(CS_DATAFMT));
strcpy(paramfmt.name, "xp_echo");
paramfmt.namelen = CS_NULLTERM;
paramfmt.datatype = CS_CHAR_TYPE;
paramfmt.format = CS_FMT_NULLTERM;
paramfmt.maxlength = ECHO_BUF_LEN;
paramfmt.locale = (CS_LOCALE *) NULL;
paramfmt.status |= CS_CANBENULL;
/*
** Describe the data being sent.
*/
if ((result == CS_SUCCEED) &&
srv_descfmt(srvproc, CS_SET,
SRV_ROWDATA, 1, ¶mfmt)
!= CS_SUCCEED)
{
result = CS_FAIL;
}
/*
** Describe and bind the buffer that
** contains the data to be sent.
*/
if ((result == CS_SUCCEED) &&
(srv_bind(srvproc, CS_SET,
SRV_ROWDATA, 1,
¶mfmt, (CS_BYTE *)
echo_str_buf, &len, &outlen)
!= CS_SUCCEED))
{
result = CS_FAIL;
}
/*
** Send the actual data.
*/
if ((result == CS_SUCCEED) &&
srv_xferdata(srvproc, CS_SET,
SRV_ROWDATA)!= CS_SUCCEED)
{
result = CS_FAIL;
}
}
/*
** Indicate to the ESP client how the
** transaction was performed.
*/
if (result == CS_FAIL)
srv_sendstatus(srvproc, 1);
else
srv_sendstatus(srvproc, 0);
/*
** Send a count of the number of rows sent to
** the client.
*/
srv_senddone(srvproc,(SRV_DONE_COUNT |
SRV_DONE_MORE), 0, 1);
}
return result;
}
| Copyright © 2005. Sybase Inc. All rights reserved. |
|
|