/******************************************************************************
**
** Source File Name = outsrv.sqC  1.1
**
** Licensed Materials - Property of IBM
**
** (C) COPYRIGHT International Business Machines Corp. 1995, 1997 
** All Rights Reserved.
**
** US Government Users Restricted Rights - Use, duplication or
** disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
**
**
** PURPOSE: This sample program demonstrates stored procedures.
**
**          There are two parts to this program:
**              - the outcli executable (placed on the client)
**              - the outsrv library (placed on the server)
**
**          Refer to the outcli.sqC program for more details on how
**          this program is invoked as the outsrv routine
**          in the outsrv library by the EXEC SQL CALL statement.
**
**          The outsrv routine will obtain the median salary of
**          employees in the "staff" table of the "sample" database.
**          This value will be placed in the input/output SQLDA and
**          returned to the outcli routine.  The outcli routine will
**          then print out the median salary.
**
**    EXTERNAL DEPENDENCIES :
**       - Existing database for precompile purposes.
**       - Precompile with the SQL precompiler (PREP in DB2)
**       - Binding to a database (BIND in DB2)
**       - Compiling and linking with the IBM Cset++ compiler (AIX and OS/2)
**         or the Microsoft Visual C++ compiler (Windows) 
**         or the compiler supported on your platform.
**
** For more information about these samples see the README file.
**
** For more information on programming in C++, see the
**    -  "Programming in C and C++" section of the Application Development Guide
**
** For more information on building C++ applications, see the:
**    - "Building C++ Applications" section of the Application Building Guide.
**
** For more information on the SQL language see the SQL Reference.
**
*******************************************************************************/
#include <memory.h>
#include <string.h>
#include <sqlenv.h>    /* :rk.1:erk. */
#include <sql.h>
#include <sqlda.h>

#ifdef __cplusplus
extern "C"
#endif

SQL_API_RC SQL_API_FN outsrv (   /* :rk.2:erk. */
    void *reserved1,
    void *reserved2,
    struct sqlda   *inout_sqlda,
    struct sqlca   *ca) {

   /* Declare a local SQLCA */
   EXEC SQL INCLUDE SQLCA;

   /* Declare Host Variables */
   EXEC SQL BEGIN DECLARE SECTION;
      short num_records;
      char  stmt[512];
   EXEC SQL END DECLARE SECTION;

   /* Declare Miscellaneous Variables */
   int counter = 0;
   EXEC SQL WHENEVER SQLERROR   GOTO error_exit;
   EXEC SQL WHENEVER SQLWARNING CONTINUE;
   EXEC SQL DECLARE c1 CURSOR FOR s1;

   /* Prepare a Statement to Obtain and Order all Salaries */
   strcpy( stmt, "SELECT salary FROM STAFF ORDER BY salary" );
   EXEC SQL PREPARE s1 FROM :stmt;
   /*Determine the Total Number of Records */
   EXEC SQL SELECT COUNT(*) INTO :num_records FROM STAFF; /* :rk.3:erk. */

   /* Fetch Salaries until the Median Salary is Obtained */
   EXEC SQL OPEN c1;
   while ( counter++ < num_records/2 + 1 )  /* :rk.4:erk. */
      EXEC SQL FETCH c1 USING DESCRIPTOR :*inout_sqlda;
   EXEC SQL CLOSE c1;
   EXEC SQL COMMIT;

   /* Return the SQLCA to the Calling Program */ /* :rk.5:erk. */
   memcpy( ca, &sqlca, sizeof( struct sqlca ) );
   return(SQLZ_DISCONNECT_PROC);

error_exit:
   /* An Error has occurred -- ROLLBACK and return to Calling Program */
   EXEC SQL WHENEVER SQLERROR CONTINUE;
   memcpy( ca, &sqlca, sizeof( struct sqlca ) );
   EXEC SQL ROLLBACK;

   return(SQLZ_DISCONNECT_PROC);
}