/*******************************************************************************
**
** Source File Name = sws.c  1.4
**
** Licensed Materials - Property of IBM
**
** (C) COPYRIGHT International Business Machines Corp. 1995, 1999 
** All Rights Reserved.
**
** US Government Users Restricted Rights - Use, duplication or
** disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
**
**
** PURPOSE : to demonstrate the use of the DATABASE MONITOR SWITCH API.
**
** OTHER APIs USED :
**          INSTANCE ATTACH               sqleatin()
**
** EXTERNAL FUNCTIONS USED IN CODE SAMPLE:
**          check_error :     Checks for SQLCODE error, and prints out any
**          [in util.c]          related information available.
**
**    EXTERNAL DEPENDENCIES :
**       - Ensure existence of database for precompile purposes.
**       - Compile and link 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.
**
*******************************************************************************/
 /******************************************************************************
     The Database Monitor Switch API

#include "sqlca.h"
#include "sqlutil.h"
#include "sqlmon.h"
#include "util.h"
int SQL_API_FN sqlmon(unsigned long        version,
                      char                 *reserved,
                      sqlm_recording_group group_states[],
                      struct sqlca         *sqlca
                     );

The 'group_states' is an input/output structure used to specify
the switches to set or query, it returns their settings.

INPUT:

version: SQLM_DBMON_VERSION1
         SQLM_DBMON_VERSION2
         Both will return the same output.

INPUT/OUTPUT:

group_states: An array of sqlm_recording_group, one for each monitor switch:
    input_state:  - SQLM_HOLD  -  Request setting for this switch
                    SQLM_OFF   -  Turn the switch OFF
                    SQLM_ON    -  Turn the switch ON
    output_state  - The current state of the switch: SQLM_OFF, or SQLM_ON
    start_time    - A timestamp, the time a which the switch was turned ON,
                    0 if the switch is OFF.

*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "sqlca.h"
#include "sqlutil.h"
#include "sqlmon.h"
#include "util.h"

#define CHECKERR(CE_STR)    if (check_error (CE_STR, &sqlca) !=0) return 1;

 /******************************************************************************
* Database Monitor Switch API Sample
*******************************************************************************/
char* sw_status_string(int val) {
    switch (val) {
    case SQLM_OFF: return "OFF";
    case SQLM_ON:  return "ON";
    }
    return "";
}
void print_sws(sqlm_recording_group group_states[SQLM_NUM_GROUPS]);
void print_sw_set_times(sqlm_recording_group group_states[SQLM_NUM_GROUPS]);

int main (int argc, char* argv[]) {
    /********************************************************************
     Set Table switch ON, UOW switch OFF, and query the current (default)
     values for the other switches.  (see Database Manager Configuration)
    ********************************************************************/
    sqlm_recording_group group_states[SQLM_NUM_GROUPS];
    struct sqlca sqlca;

    char userid[9];
    char passwd[19];
    char nodename[9];

    if (argc == 4) {
        strcpy (userid, argv[1]);
        strcpy (passwd, argv[2]);
        strcpy (nodename, argv[3]);

       
       /*************************/
       /* ATTACH API called     */
       /*************************/
        sqleatin (nodename, userid, passwd, &sqlca);
    }
    else if (argc != 1) {
        printf("\nUSAGE: sws [userid password remote_nodename]\n");
        return 1;
    }

    group_states[SQLM_TABLE_SW].input_state =       SQLM_ON;
    group_states[SQLM_UOW_SW].input_state =         SQLM_OFF;
    group_states[SQLM_STATEMENT_SW].input_state =   SQLM_HOLD;
    group_states[SQLM_BUFFER_POOL_SW].input_state = SQLM_HOLD;
    group_states[SQLM_LOCK_SW].input_state =        SQLM_HOLD;
    group_states[SQLM_SORT_SW].input_state =        SQLM_HOLD;

    /************************************\
    * DATABASE MONITOR SWITCH API called *
    \************************************/
    sqlmon(SQLM_DBMON_VERSION2, NULL, group_states, &sqlca);
    CHECKERR ("MONITOR SWITCH");

    /* Print the output */
    print_sws(group_states);          /* Print the switch values */
    print_sw_set_times(group_states); /* Print their switch set time (if ON) */

} /* end of Database Monitor Switch API sample */

 /******************************************************************************
* print switch values
*******************************************************************************/
void print_sws(sqlm_recording_group group_states[SQLM_NUM_GROUPS]) {

    printf("SQLM_UOW_SW:         %s\n",
         sw_status_string(group_states[SQLM_UOW_SW].output_state));
    printf("SQLM_STATEMENT_SW:   %s\n",
         sw_status_string(group_states[SQLM_STATEMENT_SW].output_state));
    printf("SQLM_TABLE_SW:       %s\n",
         sw_status_string(group_states[SQLM_TABLE_SW].output_state));
    printf("SQLM_BUFFER_POOL_SW: %s\n",
         sw_status_string(group_states[SQLM_BUFFER_POOL_SW].output_state));
    printf("SQLM_LOCK_SW:        %s\n",
         sw_status_string(group_states[SQLM_LOCK_SW].output_state));
    printf("SQLM_SORT_SW:        %s\n",
         sw_status_string(group_states[SQLM_SORT_SW].output_state));
} /* end print_sws */

 /******************************************************************************
* print switch set times (if ON)
*******************************************************************************/
void print_sw_set_times(
           sqlm_recording_group group_states[SQLM_NUM_GROUPS]) {

    if (group_states[SQLM_UOW_SW].start_time.seconds) {
        printf("SQLM_UOW_SW start_time:         %s\n", ctime((time_t *)
        &group_states[SQLM_UOW_SW].start_time.seconds));
    }
    if (group_states[SQLM_STATEMENT_SW].start_time.seconds) {
        printf("SQLM_STATEMENT_SW start_time:   %s\n", ctime((time_t *)
        &group_states[SQLM_STATEMENT_SW].start_time.seconds));
    }
    if (group_states[SQLM_TABLE_SW].start_time.seconds) {
        printf("SQLM_TABLE_SW start_time:       %s\n", ctime((time_t *)
        &group_states[SQLM_TABLE_SW].start_time.seconds));
    }
    if (group_states[SQLM_BUFFER_POOL_SW].start_time.seconds) {
        printf("SQLM_BUFFER_POOL_SW start_time: %s\n", ctime((time_t *)
        &group_states[SQLM_BUFFER_POOL_SW].start_time.seconds));
    }
    if (group_states[SQLM_LOCK_SW].start_time.seconds) {
        printf("SQLM_LOCK_SW start_time:        %s\n", ctime((time_t *)
        &group_states[SQLM_LOCK_SW].start_time.seconds));
    }
    if (group_states[SQLM_SORT_SW].start_time.seconds) {
        printf("SQLM_SORT_SW start_time:        %s\n", ctime((time_t *)
        &group_states[SQLM_SORT_SW].start_time.seconds));
    }
} /* end print_sw_set_times (if ON) */