/******************************************************************************
**
** Source File Name = tabspace.sqc  1.5
**
** 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 :
**       an example showing how to use TABLESPACE APIs
**       in order to:
**          - obtain tablespace information using lower level service
**            APIs (OPEN, FETCH, CLOSE)
**          - obtain tablespace information using a higher level
**            APIs (TABLESPACE QUERY, SINGLE TABLESPACE QUERY)
**          -
**
**    APIs USED :
**        TABLESPACE QUERY                       sqlbmtsq
**        SINGLE TABLESPACE QUERY                sqlbstpq
**        OPEN TABLESPACE QUERY                  sqlbotsq
**        FETCH TABLESPACE QUERY                 sqlbftpq
**        GET TABLESPACE STATISTICS              sqlbgtss
**        CLOSE TABLESPACE QUERY                 sqlbctsq
**        FREE MEMORY                            sqlefmem
**
**    STRUCTURES USED :
**       SQLB_TBSPQRY_DATA
**       sqlca
**
**    OTHER FUNCTIONS DECLARED :
**       'C' COMPILER LIBRARY :
**          stdio.h  -  printf
**
**       internal :
**          tabspaceInfo :    Displays information on the tablespace passed
**                               through.
**
**       external :
**          check_error :     Checks for SQLCODE error, and prints out any
**          [in util.c]          related information available.
**                               This procedure is located in the util.c file.
**
**    EXTERNAL DEPENDANCIES :
**       - 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.
**
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <sqlutil.h>
#include <sqlenv.h>
#include "util.h"

EXEC SQL INCLUDE SQLCA;

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

void tabspaceInfo (struct SQLB_TBSPQRY_DATA *, unsigned long);

int main (int argc, char *argv[]) {
   struct sqlca sqlca;
   struct SQLB_TBSPQRY_DATA *dataP;
   struct SQLB_TBSPQRY_DATA **dataPP;
   unsigned long numTS, maxTS, numT, index;
   unsigned long i;
   EXEC SQL BEGIN DECLARE SECTION;
      char dbname[9];
      char userid[9];
      char passwd[19];
   EXEC SQL END DECLARE SECTION;

   if (argc != 4) {
      printf ("\nUSAGE: tabspace databasename userid passwd\n\n");
      return 1;
   } /* endif */


   printf ("this is sample program: tabspace.c\n\n");

   strcpy(dbname, argv[1]);
   strcpy(userid, argv[2]);
   strcpy(passwd, argv[3]);

   EXEC SQL CONNECT TO :dbname USER :userid USING :passwd;
   CHECKERR ("CONNECT TO DATABASE");

   printf ("Using the following APIs:\n   OPEN TABLESPACE QUERY\n"
      "   FETCH TABLESPACE QUERY\n   CLOSE TABLESPACE QUERY\n");
   printf ("=========================\n");
   /**********************************\
   * OPEN TABLESPACE QUERY API called *
   \**********************************/
   sqlbotsq (&sqlca, SQLB_OPEN_TBS_ALL, &numTS);
   CHECKERR ("OPEN TABLESPACE QUERY");
   maxTS = numTS;
   dataP = (struct SQLB_TBSPQRY_DATA *) malloc (numTS *
      sizeof (struct SQLB_TBSPQRY_DATA));
   strcpy(dataP->tbspqver,SQLB_TBSPQRY_DATA_ID);

   /***********************************\
   * FETCH TABLESPACE QUERY API called *
   \***********************************/
   sqlbftpq (&sqlca, maxTS, dataP, &numTS);
   CHECKERR ("FETCH TABLESPACE QUERY");
   tabspaceInfo (dataP, numTS);
   /************************************\
   * CLOSE TABLESPACE QUERY API called *
   \************************************/
   sqlbctsq (&sqlca);
   CHECKERR ("CLOSE TABLESPACE QUERY");

   printf ("Using the SINGLE TABLESPACE QUERY API for table ID : 1\n");
   printf ("======================================================\n");
   /************************************\
   * SINGLE TABLESPACE QUERY API called *
   \************************************/
   sqlbstpq (&sqlca, 1, dataP, SQLB_RESERVED1);
   CHECKERR ("SINGLE TABLESPACE QUERY");
   tabspaceInfo (dataP, 1);

   printf ("Using the TABLESPACE QUERY API\n");
   printf ("==============================\n");
   /*****************************\
   * TABLESPACE QUERY API called *
   \*****************************/
   sqlbmtsq (&sqlca, &numTS, &(dataPP), SQLB_RESERVED1, SQLB_RESERVED2);
   CHECKERR ("TABLESPACE QUERY");
   for (i=0; i < numTS; i++ )
      tabspaceInfo (dataPP[i], 1);

   /************************\
   * FREE MEMORY API called *
   \************************/
   sqlefmem (&sqlca, dataPP);
   CHECKERR ("FREE MEMORY");

   EXEC SQL CONNECT RESET;
   CHECKERR ("CONNECT RESET");

   return 0;
}

void tabspaceInfo (struct SQLB_TBSPQRY_DATA *dataP, unsigned long num) {
   struct sqlca sqlca;
   struct SQLB_TBS_STATS tbs_stats;
   unsigned long idx;
   for (idx=0; idx < num; idx++, dataP++) {
      printf ("Tablespace ID                   = %ld\n", dataP->id);
      printf ("Tablespace Name                 = %s\n", dataP->name);

      /* "Type" and "Content" are stored bitwise in the flag field */
      printf ("Type                            = ");
      switch (dataP->flags & 0xF ) {
         case SQLB_TBS_SMS:
            printf ("System managed space\n");
            break;
         case SQLB_TBS_DMS:
            printf ("Database managed space\n");
            break;
         default:
            printf ("UNKNOWN\n");
            break;
      } /* endswitch */

      printf ("Contents                        = ");
      switch (dataP->flags & 0xF0) {
         case SQLB_TBS_ANY:
            printf ("regular contents\n");
            break;
         case SQLB_TBS_LONG:
            printf ("long field data\n");
            break;
         case SQLB_TBS_TMP:
            printf ("temp data\n");
            break;
         default:
            printf ("UNKNOWN :%d:\n", dataP->flags & 0xF0);
            break;
      } /* endswitch */

      printf ("State                           = ");
      switch (dataP->tbsState) {
         case SQLB_NORMAL:
            printf ("Normal\n");
            break;
         case SQLB_QUIESCED_SHARE:
            printf ("Quiesced: SHARE\n");
            break;
         case SQLB_QUIESCED_UPDATE:
            printf ("Quiesced: UPDATE\n");
            break;
         case SQLB_QUIESCED_EXCLUSIVE:
            printf ("Quiesced: EXCLUSIVE\n");
            break;
         case SQLB_LOAD_PENDING:
            printf ("Load pending\n");
            break;
         case SQLB_DELETE_PENDING:
            printf ("Delete pending\n");
            break;
         case SQLB_BACKUP_PENDING:
            printf ("Backup pending\n");
            break;
         case SQLB_ROLLFORWARD_IN_PROGRESS:
            printf ("Roll forward in progress\n");
            break;
         case SQLB_ROLLFORWARD_PENDING:
            printf ("Roll forward pending\n");
            break;
         case SQLB_RESTORE_PENDING:
            printf ("Restore pending\n");
            break;
         case SQLB_DISABLE_PENDING:
            printf ("Disable pending\n");
            break;
         case SQLB_REORG_IN_PROGRESS:
            printf ("Reorg in progress\n");
            break;
         case SQLB_BACKUP_IN_PROGRESS:
            printf ("Backup in progress\n");
            break;
         case SQLB_STORDEF_PENDING:
            printf ("storage must be defined\n");
            break;
         case SQLB_RESTORE_IN_PROGRESS:
            printf ("Restore in progress\n");
            break;
         case SQLB_STORDEF_ALLOWED:
            printf ("storage may be defined\n");
            break;
         case SQLB_STORDEF_FINAL_VERSION:
            printf ("storDef is in 'final' state\n");
            break;
         case SQLB_STORDEF_CHANGED:
            printf ("storDef was changed prior to rollforward\n");
            break;
         case SQLB_REBAL_IN_PROGRESS:
            printf ("dms rebalancer is active\n");
            break;
         case SQLB_PSTAT_DELETION:
            printf ("TBS deletion in progress\n");
            break;
         case SQLB_PSTAT_CREATION:
            printf ("TBS creation in progress\n");
            break;
         default:
            printf ("UNKNOWN\n");
            break;
      } /* endswitch */
      /***************************\
      * GET TABLESPACE STATISTICS *
      \***************************/
      sqlbgtss(&sqlca, dataP->id, &tbs_stats);
      if (check_error ("GET TBS STAT", &sqlca) != 0) break;

      printf ("Tablespace Statistics\n");
      printf ("total pages                     = %ld\n", tbs_stats.totalPages);
      printf ("useable pages                   = %ld\n",
         tbs_stats.useablePages);
      printf ("used pages                      = %ld\n", tbs_stats.usedPages);
      printf ("free pages                      = %ld\n", tbs_stats.freePages);
      printf ("high water mark                 = %ld\n",
         tbs_stats.highWaterMark);

      printf ("\n\n");
   } /* endfor */
}