/****************************************************************************** ** ** Source File Name = tspace.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 and TABLESPACE CONTAINER ** 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) ** - obtain tablespace container information using lower level ** service APIs (OPEN, FETCH, CLOSE) ** - obtain tablespace container information using a higher level ** API (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 ** TABLESPACE CONTAINER QUERY sqlbtcq ** OPEN TABLESPACE CONTAINER QUERY sqlbotcq ** FETCH TABLESPACE CONTAINER QUERY sqlbftcq ** CLOSE TABLESPACE CONTAINER QUERY sqlbctcq ** SET TABLESPACE CONTAINERS sqlbstsc ** FREE MEMORY sqlefmem ** ** STRUCTURES USED : ** sqlca ** ** OTHER FUNCTIONS DECLARED : ** 'C' COMPILER LIBRARY : ** stdio.h - printf ** ** internal : ** tabspaceInfo : Displays information on the tablespace passed ** through. ** tabspaceContInfo : Displays information on the tablespace ** container that is 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 ; int tabspaceInfo( struct SQLB_TBSPQRY_DATA *, unsigned long ) ; int tabspaceContInfo( struct SQLB_TBSCONTQRY_DATA *, unsigned long ) ; int main( int argc, char *argv[] ) { struct SQLB_TBSPQRY_DATA *dataP, **dataPP ; struct SQLB_TBSCONTQRY_DATA *dataTSCP ; unsigned long numTS, maxTS, numT, index ; unsigned long numTSC, tableID, nCont ; 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: tspace databasename userid passwd\n\n" ) ; return 1 ; } /* endif */ printf( "this is sample program: tspace.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" "=========================\n\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 following APIs:\n" " OPEN TABLESPACE CONTAINER QUERY\n" " FETCH TABLESPACE CONTAINER QUERY\n" " CLOSE TABLESPACE QUERY\n" "===================================\n\n" ) ; /********************************************\ * OPEN TABLESPACE CONTAINER QUERY API called * \********************************************/ sqlbotcq( &sqlca, SQLB_ALL_TABLESPACES, &numTSC ) ; CHECKERR( "OPEN TABLESPACE CONTAINER QUERY" ) ; dataTSCP = ( struct SQLB_TBSCONTQRY_DATA * ) malloc( numTSC * sizeof( struct SQLB_TBSCONTQRY_DATA ) ) ; /*********************************************\ * FETCH TABLESPACE CONTAINER QUERY API called * \*********************************************/ sqlbftcq( &sqlca, numTSC , dataTSCP, &nCont ) ; CHECKERR( "FETCH TABLESPACE CONTAINER QUERY" ) ; tableID = dataTSCP->id ; tabspaceContInfo( dataTSCP, numTSC ) ; /*********************************************\ * CLOSE TABLESPACE CONTAINER QUERY API called * \*********************************************/ sqlbctcq( &sqlca ) ; CHECKERR( "CLOSE TABLESPACE CONTAINER QUERY" ) ; printf( "Using the SINGLE TABLESPACE QUERY API for table ID : 1\n" ) ; printf( "======================================================\n\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" "==============================\n\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 ) ; printf( "Using the TABLESPACE CONTAINER QUERY API\n" "========================================\n\n" ) ; /***************************************\ * TABLESPACE CONTAINER QUERY API called * \***************************************/ sqlbtcq( &sqlca, tableID, &numTSC, &( dataTSCP ) ) ; CHECKERR( "TABLESPACE CONTAINER QUERY" ) ; tabspaceContInfo( dataTSCP, numTSC ) ; /************************\ * FREE MEMORY API called * \************************/ sqlefmem( &sqlca, dataPP ) ; CHECKERR( "FREE MEMORY" ) ; EXEC SQL CONNECT RESET; CHECKERR( "CONNECT RESET" ) ; return 0 ; } int tabspaceInfo( struct SQLB_TBSPQRY_DATA * dataP, unsigned long num ) { 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 ) ; CHECKERR( "GET TBS STAT" ) ; 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" ) ; } /* endfor */ return 0 ; } int tabspaceContInfo( struct SQLB_TBSCONTQRY_DATA * dataTSCP, unsigned long num ) { unsigned long idx ; for ( idx = 0; idx < num; idx++, dataTSCP++ ) { printf( "Tablespace Containers for Tablespace %d\n\n", dataTSCP->tbsID ) ; printf( "Container ID = %ld\n", dataTSCP->id ) ; printf( "Name = %s\n", dataTSCP->name ) ; printf( "Type = " ) ; switch ( dataTSCP->contType ) { case SQLB_CONT_PATH: printf( "path\n" ) ; break ; case SQLB_CONT_DISK: printf( "disk\n" ) ; break ; case SQLB_CONT_FILE: printf( "file\n" ) ; break ; default: printf( "unknown\n" ) ; break ; } /* endswitch */ printf( "\n" ) ; } /* endfor */ return 0 ; }