You must move Open Server application code currently running in the main routine to one or more event handlers. Other routines, such as the srv_run routine are also removed. You must also remove routines that EAServer automatically initiates, and remove properties and handlers that are configured through EAServer Manager.
The following file is a traditional Open Server application that contains a main routine:
#include <ospublic.h>
#include <server.h>
/*
** File server.c containing a typical Open Server main() function. For
** simplicity, there is no error handling here.
**
** This builds into an executable, with the supporting code, such as
** event handlers, ending up as either static libraries that become part
** of the executable, or as dynamic libraries loaded at run time.
*/
main(int argc, char *argv[])
{
/*
** Variables.
*/
CS_INT conns;
CS_INT threads;
CS_CHAR *name;
CS_CONTEXT *context;
/*
** Process command line. Function get_params() is in file appl.c.
*/
get_params(argc, argv, &conns, &threads, &name);
if (name == (CS_CHAR *) NULL)
{
printf("Usage: %s [-os_conns=<conns>] [-os_threads=<threads>] "
"-os_name=<name>\n", argv[0]);
exit(1);
}
/*
** Initialize server.
*/
cs_ctx_alloc(CS_VERSION_100, &context);
srv_version(context, CS_VERSION_100);
if (conns > 0)
srv_props(context, CS_SET, SRV_S_NUMCONNECTIONS,
(CS_VOID *) &conns, sizeof(conns), (CS_INT *) NULL);
if (threads > 0)
srv_props(context, CS_SET, SRV_S_NUMTHREADS,
(CS_VOID *) &threads, sizeof(threads), (CS_INT *) NULL)
srv_init((SRV_CONFIG *) NULL, name, CS_NULLTERM);
/*
** Register handlers. Files handler1.c and handler2.c contain these
** functions.
*/
srv_handle((SRV_SERVER *) NULL, SRV_START, start_handler);
srv_handle((SRV_SERVER *) NULL, SRV_ATTENTION, attn_handler);
srv_handle((SRV_SERVER *) NULL, SRV_BULK, bulk_handler);
srv_handle((SRV_SERVER *) NULL, SRV_CONNECT, conn_handler);
srv_handle((SRV_SERVER *) NULL, SRV_CURSOR, cur_handler);
srv_handle((SRV_SERVER *) NULL, SRV_DISCONNECT, disc_handler);
srv_handle((SRV_SERVER *) NULL, SRV_DYNAMIC, dyn_handler);
srv_handle((SRV_SERVER *) NULL, SRV_LANGUAGE, lang_handler);
srv_handle((SRV_SERVER *) NULL, SRV_RPC, rpc_handler);
srv_handle((SRV_SERVER *) NULL, SRV_OPTION, opt_handler);
/*
** Start server.
*/
srv_run((SRV_SERVER *) NULL);
exit(0);
}
The main code has been placed in an event handler, other routines and properties have been removed:
#include <ospublic.h>
#include <server.h>
/*
** File server.c. The original main() function becomes init_handler().
**
** Build this into a dynamic library, and register the
** init_handler() function in EAServer Manager. EAServer
** will call the function at runtime.
**
** You may build the supporting code into the same dynamic library, or into
** one or more different dynamic libraries. In either case, you'll need to
** register each handler separately with EAServer, using
** EAServer Manager.
*/CS_RETCODE CS_PUBLIC init_handler(CS_CONTEXT *context,
int argc, char *argv[])
{
/*
** Variables.
**
** EAServer initializes context and passes it to this function.
*/
CS_INT conns;
CS_INT threads;
CS_CHAR *name;
/*
** Process command line. Function get_params() is in file appl.c.
**
** Do not exit on error.
*/
get_params(argc, argv, &conns, &threads, &name);
/*
** Initialize server.
**
** Get rid of cs_ctx_alloc(), srv_version(), etc. Do not call srv_init().
** Certain properties previously set using srv_props() are now set
** in EAServer Manager.
*/
if (conns > 0)
srv_props(context, CS_SET, SRV_S_NUMCONNECTIONS,
(CS_VOID *) &conns, sizeof(conns), (CS_INT *) NULL);
if (threads > 0)
srv_props(context, CS_SET, SRV_S_NUMTHREADS,
(CS_VOID *) &threads, sizeof(threads), (CS_INT *) NULL);
/*
** Register handlers. Files handler1.c and handler2.c contain handler
** functions.
**
** Register all the handlers using EAServer Manager.
*/
/*
** Start server.
**
** EAServer calls srv_run(); Do not call it yourself.
*/
/*
** Return rather than exit.
*/
return CS_SUCCEED;
}
| Copyright © 2003. Sybase Inc. All rights reserved. |
|
|