/*******************************************************************************
**
** Source File Name = tbinfo.c 1.4
**
** Licensed Materials - Property of IBM
**
** (C) COPYRIGHT International Business Machines Corp. 1995, 2000
** All Rights Reserved.
**
** US Government Users Restricted Rights - Use, duplication or
** disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
**
**
** PURPOSE :
** Shows how to get/set info about tables.
**
** For more information about these samples see the README file.
**
** For more information on programming in CLI see the:
** - "Building CLI Applications" section of the Application Building Guide, and the
** - CLI Guide and Reference.
**
** For more information on the SQL language see the SQL Reference.
**
*******************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlcli1.h>
#include "utilcli.h" /* Header file for CLI sample code */
int TbListTables( SQLHANDLE) ;
int TbListColumns( SQLHANDLE) ;
int TbListRowsAndPages( SQLHANDLE) ;
int TbListTablePrivileges( SQLHANDLE) ;
int TbListColumnPrivileges( SQLHANDLE) ;
/*******************************************************************
** main
*******************************************************************/
int main( int argc, char * argv[] )
{ SQLRETURN sqlrc = SQL_SUCCESS;
int rc = 0;
SQLHANDLE henv; /* environment handle */
SQLHANDLE hdbc; /* connection handles */
char dbAlias[SQL_MAX_DSN_LENGTH + 1] ;
char user[MAX_UID_LENGTH + 1] ;
char pswd[MAX_PWD_LENGTH + 1] ;
/* checks the command line arguments */
rc = CmdLineArgsCheck1( argc, argv, dbAlias, user, pswd );
if ( rc != 0 ) return( rc ) ;
printf("\n\nTABLES: HOW TO GET INFO ABOUT TABLES.\n");
/* initialize the CLI application */
rc = CLIAppInit( dbAlias, user, pswd, &henv, &hdbc,
(SQLPOINTER)SQL_AUTOCOMMIT_ON);
if ( rc != 0 ) return( rc ) ;
rc = TbListTables( hdbc) ;
rc = TbListColumns( hdbc) ;
rc = TbListRowsAndPages( hdbc) ;
rc = TbListTablePrivileges( hdbc) ;
rc = TbListColumnPrivileges( hdbc) ;
/* terminate the CLI application */
rc = CLIAppTerm( &henv, &hdbc, dbAlias);
return( rc ) ;
} /* end main */
/******************************************************************************
** TbListTables
******************************************************************************/
int TbListTables( SQLHANDLE hdbc)
{ SQLRETURN sqlrc = SQL_SUCCESS;
int rc = 0;
SQLHANDLE hstmt ; /* statement handle */
struct
{ SQLINTEGER ind ;
SQLCHAR val[129] ;
} tbQualifier, tbSchema, tbName, tbType;
struct
{ SQLINTEGER ind ;
SQLCHAR val[255] ;
} tbRemarks;
SQLCHAR tbSchemaPattern[] = "%";
SQLCHAR tbNamePattern[] = "ST%"; /* all the tables starting with ST */
printf("\nUSE THE CLI FUNCTIONS\n");
printf("-SQLSetConnectAttr\n-SQLAllocHandle\n");
printf("-SQLTables\n-SQLBindCol\n");
printf("-SQLFetch\n-SQLFreeHandle\n");
printf("TO SHOW HOW TO LIST SOME TABLES:\n");
/* set AUTOCOMMIT on */
sqlrc = SQLSetConnectAttr( hdbc,
SQL_ATTR_AUTOCOMMIT,
(SQLPOINTER)SQL_AUTOCOMMIT_ON, SQL_NTS) ;
DBC_HANDLE_CHECK( hdbc, sqlrc);
/* allocate a statement handle */
sqlrc = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ;
DBC_HANDLE_CHECK( hdbc, sqlrc);
/* call SQLTables */
printf("\n Call SQLTables for:\n");
printf(" schemaPattern = %s\n", tbSchemaPattern);
printf(" namePattern = %s\n", tbNamePattern);
sqlrc = SQLTables( hstmt, NULL, 0,
tbSchemaPattern, SQL_NTS,
tbNamePattern, SQL_NTS,
NULL, 0);
STMT_HANDLE_CHECK( hstmt, sqlrc);
/* bind columns to variables */
sqlrc = SQLBindCol( hstmt, 1, SQL_C_CHAR, tbQualifier.val, 129,
&tbQualifier.ind ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
sqlrc = SQLBindCol( hstmt, 2, SQL_C_CHAR, tbSchema.val, 129,
&tbSchema.ind ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
sqlrc = SQLBindCol( hstmt, 3, SQL_C_CHAR, tbName.val, 129,
&tbName.ind ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
sqlrc = SQLBindCol( hstmt, 4, SQL_C_CHAR, tbType.val, 129,
&tbType.ind ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
sqlrc = SQLBindCol( hstmt, 5, SQL_C_CHAR, tbRemarks.val, 255,
&tbRemarks.ind ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
/* fetch each row, and display */
printf(" Fetch each row and dispaly.\n");
printf(" TABLE SCHEMA TABLE_NAME TABLE_TYPE\n");
printf(" -------------- -------------- ----------\n");
sqlrc = SQLFetch( hstmt );
STMT_HANDLE_CHECK( hstmt, sqlrc);
if (sqlrc == SQL_NO_DATA_FOUND)
{ printf("\n Data not found.\n");
}
while (sqlrc != SQL_NO_DATA_FOUND)
{ printf(" %-14s %-14s %-11s\n",
tbSchema.val, tbName.val, tbType.val);
if (tbRemarks.ind > 0)
{ printf(" (Remarks ) %s\n", tbRemarks.val);
}
sqlrc = SQLFetch( hstmt );
STMT_HANDLE_CHECK( hstmt, sqlrc);
}
/* free the statement handle */
sqlrc = SQLFreeHandle( SQL_HANDLE_STMT, hstmt ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
return(rc);
}
/******************************************************************************
** TbListColumns
******************************************************************************/
int TbListColumns( SQLHANDLE hdbc)
{ SQLRETURN sqlrc = SQL_SUCCESS;
int rc = 0;
SQLHANDLE hstmt ; /* statement handle */
struct
{ SQLINTEGER ind ;
SQLCHAR val[129] ;
} colName, colType;
struct
{ SQLINTEGER ind ;
SQLCHAR val[255] ;
} colRemarks;
struct
{ SQLINTEGER ind ;
SQLINTEGER val;
} colLength;
struct
{ SQLINTEGER ind ;
SQLSMALLINT val;
} colScale, colNullable;
SQLCHAR tbSchemaPattern[] = "%";
SQLCHAR tbNamePattern[] = "STAFF";
SQLCHAR colNamePattern[] = "%";
printf("\nUSE THE CLI FUNCTIONS\n");
printf("-SQLSetConnectAttr\n-SQLAllocHandle\n");
printf("-SQLColumns\n-SQLBindCol\n");
printf("-SQLFetch\n-SQLFreeHandle\n");
printf("TO SHOW HOW TO LIST SOME COLUMNS:\n");
/* set AUTOCOMMIT on */
sqlrc = SQLSetConnectAttr( hdbc,
SQL_ATTR_AUTOCOMMIT,
(SQLPOINTER)SQL_AUTOCOMMIT_ON, SQL_NTS) ;
DBC_HANDLE_CHECK( hdbc, sqlrc);
/* allocate a statement handle */
sqlrc = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ;
DBC_HANDLE_CHECK( hdbc, sqlrc);
/* call SQLColumns */
printf("\n Call SQLColumns for:\n");
printf(" tbSchemaPattern = %s\n", tbSchemaPattern);
printf(" tbNamePattern = %s\n", tbNamePattern);
printf(" colNamePattern = %s\n", colNamePattern);
sqlrc = SQLColumns( hstmt, NULL, 0,
tbSchemaPattern, SQL_NTS,
tbNamePattern, SQL_NTS,
colNamePattern, SQL_NTS);
STMT_HANDLE_CHECK( hstmt, sqlrc);
/* bind columns to variables */
sqlrc = SQLBindCol( hstmt, 4, SQL_C_CHAR, colName.val, 129,
&colName.ind ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
sqlrc = SQLBindCol( hstmt, 6, SQL_C_CHAR, colType.val, 129,
&colType.ind ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
sqlrc = SQLBindCol( hstmt, 7, SQL_C_LONG, (SQLPOINTER)&colLength.val,
sizeof(colLength.val), &colLength.ind ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
sqlrc = SQLBindCol( hstmt, 9, SQL_C_SHORT, (SQLPOINTER)&colScale.val,
sizeof(colScale.val), &colScale.ind ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
sqlrc = SQLBindCol( hstmt, 11, SQL_C_SHORT, (SQLPOINTER)&colNullable.val,
sizeof(colNullable.val), &colNullable.ind ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
sqlrc = SQLBindCol( hstmt, 12, SQL_C_CHAR, colRemarks.val, 255,
&colRemarks.ind ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
/* fetch each row, and display */
printf(" Fetch each row and dispaly.\n");
sqlrc = SQLFetch( hstmt );
STMT_HANDLE_CHECK( hstmt, sqlrc);
if (sqlrc == SQL_NO_DATA_FOUND)
{ printf("\n Data not found.\n");
}
while( sqlrc != SQL_NO_DATA_FOUND )
{ printf(" %-10.10s", colName.val);
if ( colNullable.val == SQL_NULLABLE)
{ printf(", NULLABLE");
}
else
{ printf(", NOT NULLABLE");
}
printf(", %s", colType.val);
if ( colLength.ind != SQL_NULL_DATA)
{ printf(" (%ld", colLength.val);
}
else
{ printf("(");
}
if (colScale.ind != SQL_NULL_DATA)
{ printf(", %d)\n", colScale.val);
}
else
{ printf(")\n");
}
sqlrc = SQLFetch( hstmt );
STMT_HANDLE_CHECK( hstmt, sqlrc );
} /* endwhile */
/* free the statement handle */
sqlrc = SQLFreeHandle( SQL_HANDLE_STMT, hstmt ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
return(rc);
}
/******************************************************************************
** TbListRowsAndPages
******************************************************************************/
int TbListRowsAndPages( SQLHANDLE hdbc)
{ SQLRETURN sqlrc = SQL_SUCCESS;
int rc = 0;
SQLHANDLE hstmt ; /* statement handle */
struct
{ SQLINTEGER ind ;
SQLINTEGER val ;
} tbCardinality, tbPages;
struct
{ SQLINTEGER ind ;
SQLSMALLINT val ;
} infoType;
SQLCHAR tbSchema[] = "SYSCAT";
SQLCHAR tbName[] = "TABLES";
printf("\nUSE THE CLI FUNCTIONS\n");
printf("-SQLSetConnectAttr\n-SQLAllocHandle\n");
printf("-SQLStatistics\n-SQLBindCol\n");
printf("-SQLFetch\n-SQLFreeHandle\n");
printf("TO SHOW HOW TO GET THE NUMBER OF ROWS AND PAGES:\n");
/* set AUTOCOMMIT on */
sqlrc = SQLSetConnectAttr( hdbc,
SQL_ATTR_AUTOCOMMIT,
(SQLPOINTER)SQL_AUTOCOMMIT_ON, SQL_NTS) ;
DBC_HANDLE_CHECK( hdbc, sqlrc);
/* allocate a statement handle */
sqlrc = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ;
DBC_HANDLE_CHECK( hdbc, sqlrc);
/* call SQLStatistics */
printf("\n Call SQLStatistics for:\n");
printf(" tbSchema = %s\n", tbSchema);
printf(" tbName = %s\n", tbName);
sqlrc = SQLStatistics( hstmt, NULL, 0,
tbSchema, SQL_NTS,
tbName, SQL_NTS,
SQL_INDEX_UNIQUE, SQL_QUICK);
STMT_HANDLE_CHECK( hstmt, sqlrc);
/* bind columns to variables */
sqlrc = SQLBindCol( hstmt, 7, SQL_C_SHORT, (SQLPOINTER)&infoType.val,
sizeof(infoType.val), &infoType.ind ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
sqlrc = SQLBindCol( hstmt, 11, SQL_C_LONG, (SQLPOINTER)&tbCardinality.val,
sizeof(tbCardinality.val), &tbCardinality.ind ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
sqlrc = SQLBindCol( hstmt, 12, SQL_C_LONG, (SQLPOINTER)&tbPages.val,
sizeof(tbPages.val), &tbPages.ind) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
/* fetch each row, and display */
printf(" Display the number of rows and pages.\n");
sqlrc = SQLFetch( hstmt );
STMT_HANDLE_CHECK( hstmt, sqlrc);
if (sqlrc == SQL_NO_DATA_FOUND)
{ printf("\n Data not found.\n");
}
while (sqlrc != SQL_NO_DATA_FOUND)
{ if( infoType.val == SQL_TABLE_STAT)
{ if ( tbCardinality.ind == SQL_NULL_DATA)
{ printf(" Number of rows = (Unavailable)\n");
}
else
{ printf(" Number of rows = %u\n", tbCardinality.val);
}
if ( tbPages.ind == SQL_NULL_DATA)
{ printf(" Number of pages used to store the table =");
printf("(Unavailable)\n");
}
else
{ printf(" Number of pages used to store the table = %u\n",
tbCardinality.val);
}
break;
}
sqlrc = SQLFetch( hstmt );
STMT_HANDLE_CHECK( hstmt, sqlrc);
}
/* free the statement handle */
sqlrc = SQLFreeHandle( SQL_HANDLE_STMT, hstmt ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
return(rc);
}
/******************************************************************************
** TbListTablePrivileges
******************************************************************************/
int TbListTablePrivileges( SQLHANDLE hdbc)
{ SQLRETURN sqlrc = SQL_SUCCESS;
int rc = 0;
SQLHANDLE hstmt ; /* statement handle */
struct
{ SQLINTEGER ind;
SQLCHAR val[129];
} tbSchema, tbName, grantor, grantee, privilege;
struct
{ SQLINTEGER ind;
SQLCHAR val[4];
} is_grantable;
SQLCHAR tbSchemaPattern[] = "%";
SQLCHAR tbNamePattern[] = "ORG";
printf("\nUSE THE CLI FUNCTIONS\n");
printf("-SQLSetConnectAttr\n-SQLAllocHandle\n");
printf("-SQLTablePrivileges\n-SQLBindCol\n");
printf("-SQLFetch\n-SQLFreeHandle\n");
printf("TO GET TABLE PRIVILEGES:\n");
/* set AUTOCOMMIT on */
sqlrc = SQLSetConnectAttr( hdbc,
SQL_ATTR_AUTOCOMMIT,
(SQLPOINTER)SQL_AUTOCOMMIT_ON, SQL_NTS) ;
DBC_HANDLE_CHECK( hdbc, sqlrc);
/* allocate a statement handle */
sqlrc = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ;
DBC_HANDLE_CHECK( hdbc, sqlrc);
/* call SQLTablePrivileges */
printf("\n Call SQLTablePrivileges for:\n");
printf(" tbSchemaPattern = %s\n", tbSchemaPattern);
printf(" tbNamePattern = %s\n", tbNamePattern);
sqlrc = SQLTablePrivileges( hstmt, NULL, 0,
tbSchemaPattern, SQL_NTS,
tbNamePattern, SQL_NTS);
STMT_HANDLE_CHECK( hstmt, sqlrc);
/* bind columns to variables */
sqlrc = SQLBindCol( hstmt, 2, SQL_C_CHAR, tbSchema.val, 129,
&tbSchema.ind ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
sqlrc = SQLBindCol( hstmt, 3, SQL_C_CHAR, tbName.val, 129,
&tbName.ind ) ;
sqlrc = SQLBindCol(hstmt, 4, SQL_C_CHAR, (SQLPOINTER) grantor.val, 129,
&grantor.ind);
STMT_HANDLE_CHECK( hstmt, sqlrc ) ;
sqlrc = SQLBindCol(hstmt, 5, SQL_C_CHAR, (SQLPOINTER) grantee.val, 129,
&grantee.ind);
STMT_HANDLE_CHECK( hstmt, sqlrc ) ;
sqlrc = SQLBindCol(hstmt, 6, SQL_C_CHAR, (SQLPOINTER) privilege.val, 129,
&privilege.ind);
STMT_HANDLE_CHECK( hstmt, sqlrc ) ;
sqlrc = SQLBindCol(hstmt, 7, SQL_C_CHAR, (SQLPOINTER) is_grantable.val, 4,
&is_grantable.ind);
STMT_HANDLE_CHECK( hstmt, sqlrc ) ;
/* Fetch each row, and display */
printf("\n Current User's Privileges \n");
printf(" Table Grantor Grantee Privilege Grantable\n");
printf(" ----- -------- ------------ ---------- ---------\n");
sqlrc = SQLFetch( hstmt );
STMT_HANDLE_CHECK( hstmt, sqlrc );
if (sqlrc == SQL_NO_DATA_FOUND)
{ printf("\nData not found.\n");
}
while ( sqlrc != SQL_NO_DATA_FOUND )
{ printf(" %-5s", tbName.val);
printf(" %-8s", grantor.val);
printf(" %-12s", grantee.val);
printf(" %-10s", privilege.val);
printf(" %-3s\n", is_grantable.val);
sqlrc = SQLFetch( hstmt );
STMT_HANDLE_CHECK( hstmt, sqlrc );
} /* endwhile */
/* free the statement handle */
sqlrc = SQLFreeHandle( SQL_HANDLE_STMT, hstmt ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
return(rc);
}
/******************************************************************************
** TbListColumnPrivileges
******************************************************************************/
int TbListColumnPrivileges( SQLHANDLE hdbc)
{ SQLRETURN sqlrc = SQL_SUCCESS;
int rc = 0;
SQLHANDLE hstmt ; /* statement handle */
SQLHANDLE hstmtTable;
struct
{ SQLINTEGER ind;
SQLCHAR val[129];
} colName, grantor, grantee, privilege;
struct
{ SQLINTEGER ind;
SQLCHAR val[4];
} is_grantable;
SQLCHAR tbSchema[] = "SCHEMA";
SQLCHAR tbName[] = "TABLE_NAME";
SQLCHAR colNamePattern[] = "%";
SQLCHAR stmt[100];
printf("\nUSE THE CLI FUNCTIONS\n");
printf("-SQLSetConnectAttr\n-SQLAllocHandle\n");
printf("-SQLTablePrivileges\n-SQLBindCol\n");
printf("-SQLFetch\n-SQLFreeHandle\n");
printf("TO GET COLUMN PRIVILEGES:\n");
/* set AUTOCOMMIT on */
sqlrc = SQLSetConnectAttr( hdbc,
SQL_ATTR_AUTOCOMMIT,
(SQLPOINTER)SQL_AUTOCOMMIT_ON, SQL_NTS) ;
DBC_HANDLE_CHECK( hdbc, sqlrc);
/* allocate a statement handle */
sqlrc = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmtTable ) ;
DBC_HANDLE_CHECK( hdbc, sqlrc);
/* create a test table */
sprintf( (char *)stmt, "CREATE TABLE %s.%s ( COL1 CHAR(10))", tbSchema, tbName );
printf("\n Execute directly\n");
printf(" %s\n", stmt);
sqlrc = SQLExecDirect( hstmtTable, stmt, SQL_NTS ) ;
STMT_HANDLE_CHECK( hstmtTable, sqlrc);
/* allocate a statement handle */
sqlrc = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ;
DBC_HANDLE_CHECK( hdbc, sqlrc);
/* call SQLColumnPrivileges */
printf("\n Call SQLColumnPrivileges for:\n");
printf(" tbSchema = %s\n", tbSchema);
printf(" tbName = %s\n", tbName);
sqlrc = SQLColumnPrivileges( hstmt, NULL, 0,
tbSchema, SQL_NTS,
tbName, SQL_NTS,
colNamePattern, SQL_NTS);
STMT_HANDLE_CHECK( hstmt, sqlrc);
/* bind columns to variables */
sqlrc = SQLBindCol( hstmt, 4, SQL_C_CHAR, colName.val, 129,
&colName.ind ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
sqlrc = SQLBindCol(hstmt, 5, SQL_C_CHAR, (SQLPOINTER) grantor.val, 129,
&grantor.ind);
STMT_HANDLE_CHECK( hstmt, sqlrc ) ;
sqlrc = SQLBindCol(hstmt, 6, SQL_C_CHAR, (SQLPOINTER) grantee.val, 129,
&grantee.ind);
STMT_HANDLE_CHECK( hstmt, sqlrc ) ;
sqlrc = SQLBindCol(hstmt, 7, SQL_C_CHAR, (SQLPOINTER) privilege.val, 129,
&privilege.ind);
STMT_HANDLE_CHECK( hstmt, sqlrc ) ;
sqlrc = SQLBindCol(hstmt, 8, SQL_C_CHAR, (SQLPOINTER) is_grantable.val, 4,
&is_grantable.ind);
STMT_HANDLE_CHECK( hstmt, sqlrc ) ;
/* Fetch each row, and display */
printf("\n Current User's Privileges for table %s.%s\n", tbSchema, tbName);
printf(" Column Grantor Grantee Privilege Grantable\n");
printf(" ------- -------- ------------ ---------- ---------\n");
sqlrc = SQLFetch( hstmt );
STMT_HANDLE_CHECK( hstmt, sqlrc );
if (sqlrc == SQL_NO_DATA_FOUND)
{ printf("\nData not found.\n");
}
while ( sqlrc != SQL_NO_DATA_FOUND )
{ printf(" %-7s", colName.val);
printf(" %-8s", grantor.val);
printf(" %-12s", grantee.val);
printf(" %-10s", privilege.val);
printf(" %-3s\n", is_grantable.val);
sqlrc = SQLFetch( hstmt );
STMT_HANDLE_CHECK( hstmt, sqlrc );
} /* endwhile */
/* free the statement handle */
sqlrc = SQLFreeHandle( SQL_HANDLE_STMT, hstmt ) ;
STMT_HANDLE_CHECK( hstmt, sqlrc);
/* drop the test table */
sprintf((char*) stmt, "DROP TABLE %s.%s", tbSchema, tbName );
printf("\n Execute directly\n");
printf(" %s\n", stmt);
sqlrc = SQLExecDirect( hstmtTable, stmt, SQL_NTS ) ;
STMT_HANDLE_CHECK( hstmtTable, sqlrc);
/* free the statement handle */
sqlrc = SQLFreeHandle( SQL_HANDLE_STMT, hstmtTable ) ;
STMT_HANDLE_CHECK( hstmtTable, sqlrc);
return(rc);
}