oracletool.pl
上传用户:abclishi
上传日期:2007-01-07
资源大小:99k
文件大小:435k
源码类别:

Oracle数据库

开发平台:

Perl

  1. ";
  2.    print <<"EOF";
  3. <TABLE BORDER =0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  4.   <FORM METHOD=POST ACTION=$scriptname>
  5.     <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  6.     <INPUT TYPE="SUBMIT" NAME="foobar" VALUE="Alter rollback(s)"> <B>&nbsp;Shrink to&nbsp;</B>
  7.     <INPUT TYPE=TEXT NAME=shrinkto SIZE=10> 
  8.     <P>
  9.     <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  10.     <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  11.     <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="DBADMIN">
  12.     <INPUT TYPE="HIDDEN" NAME="arg" VALUE="alter_rollbacks">
  13.   <TR>
  14.     <TD WIDTH=100%>
  15.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  16.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Online</TH>
  17.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Shrink</TH>
  18.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Offline</TH>
  19.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>RBS</TH>
  20.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Owner</TH>
  21.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Tablespace</TH>
  22.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Status</TH>
  23.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Bytes</TH>
  24.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Optimal</TH>
  25.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Initial extent</TH>
  26.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Next extent</TH>
  27.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Extents</TH>
  28.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Max extents</TH>
  29. EOF
  30.    $cursor = $dbh->prepare($sql);
  31.    $cursor->execute;
  32.    while (($rbs,$id,$owner,$tsname,$status,$bytes,$init,$next,$extents,$max) = $cursor->fetchrow_array) {
  33.       $sql1 = "
  34. SELECT
  35.    NVL(TO_CHAR(OPTSIZE,'999,999,999,999'),'Not set')
  36. FROM V$rollstat
  37.    WHERE USN = $id
  38. ";
  39.       $cursor1 = $dbh->prepare($sql1);
  40.       $cursor1->execute;
  41.       $optimal = $cursor1->fetchrow_array;
  42.       $optimal = "Unknown" unless $optimal;
  43.       $cursor1->finish;
  44.       print <<"EOF";
  45.         <TR>
  46.           <TD ALIGN=CENTER BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><INPUT TYPE=CHECKBOX NAME=alter~$rbs~online></TD>
  47.           <TD ALIGN=CENTER BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><INPUT TYPE=CHECKBOX NAME=alter~$rbs~shrink></TD>
  48.           <TD ALIGN=CENTER BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><INPUT TYPE=CHECKBOX NAME=alter~$rbs~offline></TD>
  49.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$rbs</TD>
  50.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$owner</TD>
  51.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$tsname</TD>
  52.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$status</TD>
  53.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$bytes</TD>
  54.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$optimal</TD>
  55.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$init</TD>
  56.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$next</TD>
  57.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$extents</TD>
  58.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$max</TD>
  59.         </TR>
  60. EOF
  61.    }
  62.    $cursor->finish;
  63.    print <<"EOF";
  64.       </TABLE>
  65.     </TD>
  66.   </TR>
  67.   </FORM>
  68. </TABLE>
  69. EOF
  70.    logit("Exit subroutine rbsList");
  71. }
  72. sub sessionList {
  73.    logit("Enter subroutine sessionList");
  74.    my ($sql,$cursor,$status);
  75.    my ($username,$sid,$serial,$osuser,$command,$logon_time,$process,$machine);
  76.    refreshButton();
  77.    text("Select the sessions you would like to kill.n");
  78.    $sql = "$copyright
  79. SELECT 
  80.    USERNAME,
  81.    SID,
  82.    SERIAL#,
  83.    STATUS,
  84.    OSUSER,
  85.    DECODE(COMMAND,
  86.         '0','No command in progress',
  87.         '1','Create table',
  88.         '2','Insert',
  89.         '3','Select',
  90.         '4','Create cluster',
  91.         '5','Alter cluster',
  92.         '6','Update',
  93.         '7','Delete',
  94.         '8','Drop cluster',
  95.         '9','Create index',
  96.         '10','Drop index',
  97.         '11','Alter index',
  98.         '12','Drop table',
  99.         '13','Create sequence',
  100.         '14','Alter sequence',
  101.         '15','Alter table',
  102.         '16','Drop sequence',
  103.         '17','Grant',
  104.         '18','Revoke',
  105.         '19','Create synonym',
  106.         '20','Drop synonym',
  107.         '21','Create view',
  108.         '22','Drop view',
  109.         '23','Validate index',
  110.         '24','Create procedure',
  111.         '25','Alter procedure',
  112.         '26','Lock table',
  113.         '27','No operation in progress',
  114.         '28','Rename',
  115.         '29','Comment',
  116.         '30','Audit',
  117.         '31','Noaudit',
  118.         '32','Create database link',
  119.         '33','Drop database link',
  120.         '34','Create database',
  121.         '35','Alter database',
  122.         '36','Create rollback segment',
  123.         '37','Alter rollback segment',
  124.         '38','Drop rollback segment',
  125.         '39','Create tablespace',
  126.         '40','Alter tablespace',
  127.         '41','Drop tablespace',
  128.         '42','Alter session',
  129.         '43','Alter user',
  130.         '44','Commit',
  131.         '45','Rollback',
  132.         '46','Savepoint',
  133.         '47','PL/SQL Execute',
  134.         '48','Set transaction',
  135.         '49','Alter system switch log',
  136.         '50','Explain',
  137.         '51','Create user',
  138.         '52','Create role',
  139.         '53','Drop user',
  140.         '54','Drop role',
  141.         '55','Set role',
  142.         '56','Create schema',
  143.         '57','Create control file',
  144.         '58','Alter tracing',
  145.         '59','Create trigger',
  146.         '60','Alter trigger',
  147.         '61','Drop trigger',
  148.         '62','Analyze table',
  149.         '63','Analyze index',
  150.         '64','Analyze cluster',
  151.         '65','Create profile',
  152.         '66','Drop profile',
  153.         '67','Alter profile',
  154.         '68','Drop procedure',
  155.         '69','Drop procedure',
  156.         '70','Alter resource cost',
  157.         '71','Create snapshot log',
  158.         '72','Alter snapshot log',
  159.         '73','Drop snapshot log',
  160.         '74','Create snapshot',
  161.         '75','Alter snapshot',
  162.         '76','Drop snapshot',
  163.         '79','Alter role',
  164.         '85','Truncate table',
  165.         '86','Truncate cluster',
  166.         '88','Alter view',
  167.         '91','Create function',
  168.         '92','Alter function',
  169.         '93','Drop function',
  170.         '94','Create package',
  171.         '95','Alter package',
  172.         '96','Drop package',
  173.         '97','Create package body',
  174.         '98','Alter package body',
  175.         '99','Drop package body'),
  176.    TO_CHAR(LOGON_TIME,'Day MM/DD/YY HH24:MI'),
  177.    PROCESS,
  178.    MACHINE
  179. FROM V$SESSION
  180.    WHERE USERNAME IS NOT NULL
  181.    ORDER BY USERNAME, STATUS, SID, SERIAL#
  182. ";
  183.    # Print the heading
  184.    print <<"EOF";
  185. <TABLE BORDER =0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  186.   <FORM METHOD=POST ACTION=$scriptname>
  187.     <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  188.     <INPUT TYPE="SUBMIT" NAME="foobar" VALUE="Kill marked sessions"><BR>
  189.     <P>
  190.     <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  191.     <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  192.     <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="DBADMIN">
  193.     <INPUT TYPE="HIDDEN" NAME="arg" VALUE="killsessions">
  194.   <TR>
  195.     <TD WIDTH=100%>
  196.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  197.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Mark</TH>
  198.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Ora user</TH>
  199.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>SID</TH>
  200.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Serial#</TH>
  201.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Status</TH>
  202.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>OS user</TH>
  203.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Command</TH>
  204.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Logon time</TH>
  205.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Process</TH>
  206.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Machine</TH>
  207. EOF
  208.    $cursor = $dbh->prepare($sql);
  209.    $cursor->execute;
  210.    while (($username,$sid,$serial,$status,$osuser,$command,$logon_time,$process,$machine) = $cursor->fetchrow_array) {
  211.       print <<"EOF";
  212.         <TR>
  213.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><INPUT TYPE=CHECKBOX NAME=killsession_$sid~$serial></TD>
  214.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$username</TD>
  215.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$sid</TD>
  216.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$serial</TD>
  217.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$status</TD>
  218.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$osuser</TD>
  219.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$command</TD>
  220.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$logon_time</TD>
  221.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$process</TD>
  222.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$machine</TD>
  223.         </TR>
  224. EOF
  225.    }
  226.    $cursor->finish;
  227.    print <<"EOF";
  228.       </TABLE>
  229.     </TD>
  230.   </TR>
  231.   </FORM>
  232. </TABLE>
  233. EOF
  234.    refreshButton();
  235.    logit("Exit subroutine sessionList");
  236. }
  237. sub auditList {
  238.    logit("Enter subroutine auditList");
  239.    my ($sql,$cursor,$username,$audit_option,$new_audit_option,$count);
  240.    my ($object_name,$object_type,$owner);
  241.    $sql = "$copyright
  242. SELECT COUNT(*) FROM DBA_STMT_AUDIT_OPTS
  243. ";
  244.    $cursor = $dbh->prepare($sql);
  245.    $cursor->execute;
  246.    $count = $cursor->fetchrow_array;
  247.    $cursor->finish;
  248.    if ($count) {
  249.       text("SQL statement / System audits");
  250.       $sql = "$copyright
  251. SELECT
  252.    AUDIT_OPTION         "Audit option",
  253.    USER_NAME            "Username"
  254. FROM DBA_STMT_AUDIT_OPTS
  255.    ORDER BY USER_NAME, AUDIT_OPTION
  256. ";
  257.       print <<"EOF";
  258. <TABLE BORDER =0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  259.   <FORM METHOD=POST ACTION=$scriptname>
  260.     <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  261.     <INPUT TYPE="SUBMIT" NAME="foobar" VALUE="Remove marked audits">
  262.     <P>
  263.     <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  264.     <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  265.     <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="DBADMIN">
  266.     <INPUT TYPE="HIDDEN" NAME="arg" VALUE="removestmtaudits">
  267.   <TR>
  268.     <TD WIDTH=100%>
  269.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  270.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Mark</TH>
  271.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Audit option</TH>
  272.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Username</TH>
  273. EOF
  274.       $cursor = $dbh->prepare($sql);
  275.       $cursor->execute;
  276.       while (($audit_option,$username) = $cursor->fetchrow_array) {
  277.          $new_audit_option = $audit_option;
  278.          $new_audit_option =~ s/ /+/g;
  279.          print <<"EOF";
  280.         <TR>
  281.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><INPUT TYPE=CHECKBOX NAME=removeaudit_$new_audit_option~$username></TD>
  282.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$username</TD>
  283.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$audit_option</TD>
  284.         </TR>
  285. EOF
  286.    }
  287.       $cursor->finish;
  288.       print <<"EOF";
  289.       </TABLE>
  290.     </TD>
  291.   </TR>
  292.   </FORM>
  293. </TABLE>
  294. EOF
  295.    } else {
  296.       message("There are no SQL statement / System audits enabled.");
  297.    }
  298.    $sql = "$copyright
  299. SELECT
  300.    COUNT(*)
  301. FROM DBA_OBJ_AUDIT_OPTS
  302. WHERE ALT != '-/-'
  303. OR AUD != '-/-'
  304. OR COM != '-/-'
  305. OR DEL != '-/-'
  306. OR GRA != '-/-'
  307. OR IND != '-/-'
  308. OR INS != '-/-'
  309. OR LOC != '-/-'
  310. OR REN != '-/-'
  311. OR SEL != '-/-'
  312. OR UPD != '-/-'
  313. OR REF != '-/-'
  314. OR EXE != '-/-'
  315. ";
  316.    $sql = "$copyright
  317. SELECT
  318.    COUNT(*)
  319. FROM DBA_OBJ_AUDIT_OPTS
  320. WHERE ALT != '-/-'
  321. OR AUD != '-/-'
  322. OR COM != '-/-'
  323. OR DEL != '-/-'
  324. OR GRA != '-/-'
  325. OR IND != '-/-'
  326. OR INS != '-/-'
  327. OR LOC != '-/-'
  328. OR REN != '-/-'
  329. OR SEL != '-/-'
  330. OR UPD != '-/-'
  331. OR EXE != '-/-'
  332. OR CRE != '-/-'
  333. OR REA != '-/-'
  334. OR WRI != '-/-'
  335. " if ($oracle8);
  336.    $cursor = $dbh->prepare($sql);
  337.    $cursor->execute;
  338.    $count = $cursor->fetchrow_array;
  339.    $cursor->finish;
  340.    if ($count) {
  341.       text("Schema object audits");
  342.       $sql = "$copyright
  343. SELECT
  344.    OBJECT_NAME         "Object name",
  345.    OBJECT_TYPE         "Object type",
  346.    OWNER               "Owner"
  347. FROM DBA_OBJ_AUDIT_OPTS
  348. WHERE ALT != '-/-'
  349. OR AUD != '-/-'
  350. OR COM != '-/-'
  351. OR DEL != '-/-'
  352. OR GRA != '-/-'
  353. OR IND != '-/-'
  354. OR INS != '-/-'
  355. OR LOC != '-/-'
  356. OR REN != '-/-'
  357. OR SEL != '-/-'
  358. OR UPD != '-/-'
  359. OR REF != '-/-'
  360. OR EXE != '-/-'
  361. ORDER BY OWNER
  362. ";
  363.       $sql = "$copyright
  364. SELECT
  365.    OBJECT_NAME         "Object name",
  366.    OBJECT_TYPE         "Object type",
  367.    OWNER               "Owner"
  368. FROM DBA_OBJ_AUDIT_OPTS
  369. WHERE ALT != '-/-'
  370. OR AUD != '-/-'
  371. OR COM != '-/-'
  372. OR DEL != '-/-'
  373. OR GRA != '-/-'
  374. OR IND != '-/-'
  375. OR INS != '-/-'
  376. OR LOC != '-/-'
  377. OR REN != '-/-'
  378. OR SEL != '-/-'
  379. OR UPD != '-/-'
  380. OR EXE != '-/-'
  381. OR CRE != '-/-'
  382. OR REA != '-/-'
  383. OR WRI != '-/-'
  384. ORDER BY OWNER
  385. " if ($oracle8);
  386.       print <<"EOF";
  387. <TABLE BORDER =0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  388.   <FORM METHOD=POST ACTION=$scriptname>
  389.     <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  390.     <INPUT TYPE="SUBMIT" NAME="foobar" VALUE="Remove marked audits">
  391.     <P>
  392.     <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  393.     <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  394.     <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="DBADMIN">
  395.     <INPUT TYPE="HIDDEN" NAME="arg" VALUE="removeobjaudits">
  396.   <TR>
  397.     <TD WIDTH=100%>
  398.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  399.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Mark</TH>
  400.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Object name</TH>
  401.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Object type</TH>
  402.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Owner</TH>
  403. EOF
  404.       $cursor = $dbh->prepare($sql);
  405.       $cursor->execute;
  406.       while (($object_name,$object_type,$owner) = $cursor->fetchrow_array) {
  407.          print <<"EOF";
  408.         <TR>
  409.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><INPUT TYPE=CHECKBOX NAME=removeaudit_$owner~$object_name></TD>
  410.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$object_name</TD>
  411.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$object_type</TD>
  412.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$owner</TD>
  413.         </TR>
  414. EOF
  415.    }
  416.       $cursor->finish;
  417.       print <<"EOF";
  418.       </TABLE>
  419.     </TD>
  420.   </TR>
  421.   </FORM>
  422. </TABLE>
  423. EOF
  424.    } else {
  425.       message("There are no individual schema object audits enabled.");
  426.    }
  427.    logit("Exit subroutine auditList");
  428. }
  429. sub enterDDLtables {
  430.    logit("Enter subroutine enterDDLtables");
  431.    text("Choose a schema to reverse engineer select tables.");
  432.       print <<"EOF";
  433. </CENTER>
  434. <FORM METHOD=POST ACTION=$scriptname>
  435.   <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  436.   <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="SCHEMATABLEDDL">
  437.   <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  438.   <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  439. Choose a schema
  440.   <SELECT SIZE=1 NAME=username>
  441. EOF
  442.    $sql = "$copyright
  443. SELECT
  444.   DISTINCT OWNER
  445. FROM DBA_TABLES
  446.    ORDER BY OWNER
  447. ";
  448.    $cursor = $dbh->prepare($sql);
  449.    $cursor->execute;
  450.    while ($username = $cursor->fetchrow) {
  451.       print "    <OPTION>$usernamen";
  452.    }
  453.    $cursor->finish;
  454.    print <<"EOF";
  455.   </SELECT>
  456.   <P>
  457.   <INPUT TYPE="SUBMIT" NAME="foobar" VALUE="Display tables">
  458. </FORM>
  459. EOF
  460.    print "<P><HR WIDTH=90%><P>n";
  461.    text("Enter fully qualified table names separated by commas.<BR>Example: scott.table1, bill.bills_table, prod.bigtable");
  462.    print <<"EOF";
  463. <FORM METHOD=POST ACTION="$scriptname">
  464.   <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  465.   <INPUT TYPE=TEXT NAME=arg SIZE=$textarea_w MAXLENGTH=1024>
  466.   <P>
  467.   <INPUT TYPE=HIDDEN NAME="object_type" VALUE="TABLEDDL">
  468.   <INPUT TYPE=HIDDEN NAME="database" VALUE="$database">
  469.   <INPUT TYPE=HIDDEN NAME="schema" VALUE="$schema]">
  470.   <INPUT TYPE=SUBMIT VALUE="Generate DDL">
  471.   <INPUT TYPE="CHECKBOX" NAME="headertype" VALUE="octet"><B>Send DDL to your workstation
  472. </FORM>
  473. EOF
  474.    logit("Exit subroutine enterDDLtables");
  475. }
  476. sub showMenu {
  477.    logit("Enter subroutine showMenu");
  478.    my $schema = shift;
  479.    my ($bgline,$key);
  480.    $bgline = "<BODY LINK=$linkcolor ALINK=$linkcolor VLINK=$linkcolor BGCOLOR=$bgcolor>n";
  481.    if ($menuimage) {
  482.       if ((-e "$ENV{'DOCUMENT_ROOT'}/$menuimage") && (-r "$ENV{'DOCUMENT_ROOT'}/$menuimage")) {
  483.          logit("   Menu image is $ENV{'DOCUMENT_ROOT'}/$menuimage and is readable");
  484.          $bgline = "<BODY LINK=$linkcolor ALINK=$linkcolor VLINK=$linkcolor BACKGROUND=$menuimage>n";
  485.       }
  486.    }
  487.       
  488.    print <<"EOF";
  489. Content-type: Text/htmlnn
  490. <HTML>
  491. $bgline
  492. <FONT FACE="" SIZE="2" COLOR="$fontcolor">
  493. <CENTER>
  494. <P>
  495. <TABLE "WIDTH=100%">
  496.   <TR WIDTH="100%">
  497.     <TD VALIGN="TOP">
  498. EOF
  499. Button("$scriptname?database=$database&object_type=LISTUSERS TARGET=body","Schema list","$headingcolor");
  500. Button("$scriptname?database=$database&object_type=SESSIONMENU TARGET=body","Session info","$headingcolor");
  501. Button("$scriptname?database=$database&object_type=TABLESPACES TARGET=body","Tablespaces","$headingcolor");
  502. Button("$scriptname?database=$database&object_type=DATAFILES TARGET=body","Datafiles","$headingcolor");
  503. Button("$scriptname?database=$database&object_type=REDOLOGS TARGET=body","Redo / Archives","$headingcolor");
  504. Button("$scriptname?database=$database&object_type=ROLLBACKMENU TARGET=body","Rollback segs","$headingcolor");
  505. Button("$scriptname?database=$database&object_type=PERFMENU TARGET=body","Perf / memory","$headingcolor");
  506. Button("$scriptname?database=$database&object_type=CONTENTION TARGET=body","Locks / contends","$headingcolor");
  507. Button("$scriptname?database=$database&object_type=EXPLAIN TARGET=body","Explain plan","$headingcolor");
  508. Button("$scriptname?database=$database&object_type=WORKSHEET&schema=$schema TARGET=body","SQL Worksheet","$headingcolor");
  509. Button("$scriptname?database=$database&object_type=SECURITY TARGET=body","Security","$headingcolor");
  510. Button("$scriptname?database=$database&object_type=CONTROLFILES TARGET=body","Controlfiles","$headingcolor");
  511. Button("$scriptname?database=$database&object_type=PARAMETERS TARGET=body","Init parameters","$headingcolor");
  512. if ($oracle8) {
  513.    if (repmaster()) {
  514.       Button("$scriptname?database=$database&object_type=REPMASTER TARGET=body","Replication (M)","$headingcolor");
  515.    }
  516.    if (repsnapshot()) {
  517.       Button("$scriptname?database=$database&object_type=REFRESHGROUPS TARGET=body","Replication (S)","$headingcolor");
  518.    }
  519.    if (advrep()) {
  520.       Button("$scriptname?database=$database&object_type=ADVREP TARGET=body","Advanced Replication","$headingcolor");
  521.    }
  522. }
  523. if (parallel()) {
  524.    Button("$scriptname?database=$database&object_type=OPSPAGE TARGET=body","OPS specific","$headingcolor");
  525. }
  526. if ($oracle8) {
  527.    if ((backupsFound()) || (rmanCatalogExists())) {
  528.       Button("$scriptname?database=$database&object_type=BACKUPMENU TARGET=body","RMAN","$headingcolor");
  529.    }
  530. }
  531. if ($oracle8i && statsPackInstalled()) {
  532.    Button("$scriptname?database=$database&object_type=STATSPACKMENU TARGET=body","Statspack","$headingcolor");
  533. }
  534. Button("$scriptname?database=$database&object_type=RECENTEVENTS TARGET=body","Recent events","$headingcolor");
  535. Button("$scriptname?database=$database&object_type=PREFMENU TARGET=body","Preferences","$headingcolor");
  536. Button("$scriptname?database=$database&object_type=TASKMENU TARGET=body","DB Admin","$headingcolor");
  537. Button("$scriptname TARGET=_top","Change connection","$headingcolor");
  538.    print <<"EOF";
  539.       <FORM METHOD=POST ACTION=$scriptname TARGET=body>
  540.         <INPUT TYPE="TEXT" NAME="arg" SIZE="10">
  541.         <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  542.         <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="OBJECTSEARCH">
  543.         <INPUT TYPE="SUBMIT" VALUE="Search">
  544.       </FORM>
  545. EOF
  546. # Add plugins if found
  547. foreach $key(keys %plugins) {
  548.    Button("$plugins{$key} TARGET=body","$key","$headingcolor");
  549. }
  550. Button("","<FONT COLOR=RED>DEBUG ON</FONT>","$headingcolor") if $debug;
  551. Button("","<FONT COLOR=RED>LOGGING</FONT>","$headingcolor") if $logging;
  552. Button("$scriptname?database=About_oracletool TARGET=body","About","$headingcolor");
  553. print <<"EOF";
  554.     </TD>
  555.   </TR>
  556. </TABLE>
  557. EOF
  558.    logit("Exit subroutine showMenu");
  559. exit;
  560. }
  561. sub Footer {
  562.    logit("Enter subroutine Footer");
  563. # Usage: Footer();
  564. # Creates a HTML footer that refers back
  565. print <<"EOF";
  566. </BODY>
  567. </HTML>
  568. EOF
  569.    logit("Exit subroutine Footer");
  570. }
  571. sub ErrorPage {
  572.    logit("Enter subroutine ErrorPage");
  573. # Usage: ErrorPage ($message);
  574.    my $message          = shift;
  575.    my $bgline = "<BODY BGCOLOR=$bgcolor>n";
  576.    if ($menuimage) {
  577.       if ((-e "$ENV{'DOCUMENT_ROOT'}/$menuimage") && (-r "$ENV{'DOCUMENT_ROOT'}/$menuimage")) {
  578.          logit("   Menu image is $ENV{'DOCUMENT_ROOT'}/$menuimage and is readable");
  579.          $bgline = "<BODY BACKGROUND=$menuimage>n";
  580.       }
  581.    }
  582. print <<EOF;
  583. Content-type: Text/htmlnn
  584. <HTML>
  585.   <HEAD>
  586.     <TITLE>Error!</TITLE>
  587.   </HEAD>
  588.       $bgline
  589.       <FONT FACE="$font" SIZE="$fontsize" COLOR="$fontcolor">
  590.       <CENTER>
  591.       $message
  592.       </CENTER>
  593.   </BODY
  594. </HTML>
  595. EOF
  596.    logit("Exit subroutine ErrorPage");
  597. exit(1);
  598. }
  599. sub TempPage {
  600.    logit("Enter subroutine TempPage");
  601. # Usage: TempPage ($message,$duration,$url);
  602.    my $message  = shift;
  603.    my $duration = shift;
  604.    my $url      = shift;
  605.    my $bgline = "<BODY BGCOLOR=$bgcolor>n";
  606.    if ($menuimage) {
  607.       if ((-e "$ENV{'DOCUMENT_ROOT'}/$menuimage") && (-r "$ENV{'DOCUMENT_ROOT'}/$menuimage")) {
  608.          logit("   Menu image is $ENV{'DOCUMENT_ROOT'}/$menuimage and is readable");
  609.          $bgline = "<BODY BACKGROUND=$menuimage>n";
  610.       }
  611.    }
  612. print <<EOF;
  613. Content-type: Text/htmlnn
  614. <HTML>
  615.   <HEAD>
  616.     <TITLE>Notice!</TITLE>
  617.     <META HTTP-EQUIV="Refresh" Content="$duration;URL=$url">
  618.   </HEAD>
  619.     $bgline
  620.     <FONT FACE="$font" SIZE="$fontsize" COLOR="$fontcolor">
  621.     <CENTER>
  622.       $message
  623.     </CENTER
  624.   </BODY
  625. </HTML>
  626. EOF
  627.    logit("Exit subroutine TempPage");
  628. }
  629. sub getDBblocksize {
  630.    logit("Enter subroutine getDBblocksize");
  631. # Find out the database block size
  632.    my $sql = "$copyright
  633. SELECT VALUE
  634.    FROM V$PARAMETER
  635. WHERE NAME = 'db_block_size'
  636. ";
  637.    my $cursor = $dbh->prepare($sql);
  638.    $cursor->execute;
  639.    my $db_block_size = $cursor->fetchrow_array;
  640.    $cursor->finish;
  641.    logit("   DB_BLOCK_SIZE = $db_block_size");
  642.    logit("Exit subroutine getDBblocksize");
  643.    return ($db_block_size);
  644. }
  645. sub getBanner {
  646.    logit("Enter subroutine getBanner");
  647.    my ($banner,$port,$foo);
  648. # Get the oracle version info
  649.    my $sql = "$copyright
  650. SELECT BANNER 
  651.    FROM V$VERSION
  652. WHERE BANNER LIKE 'Oracle%'
  653. ";
  654.    my $cursor = $dbh->prepare($sql);
  655.    $cursor->execute;
  656.    $banner = $cursor->fetchrow_array;
  657.    $cursor->finish;
  658. # Add to the banner PORT information. (OS, hardware)
  659.    $sql = "$copyright
  660. BEGIN
  661.    :port := SYS.DBMS_UTILITY.PORT_STRING;
  662. END;
  663. ";
  664.    $cursor = $dbh->prepare($sql);
  665.    $cursor->bind_param_inout(":port", $port, 1);
  666.    $cursor->execute;
  667.    $banner = "$banner ($port)";
  668.    $cursor->finish;
  669.    $sql = "$copyright
  670. SELECT
  671.    TO_CHAR(TO_DATE(D.VALUE,'J'),'Day, Month DD, YYYY')||' -  '||
  672.    TO_CHAR(TO_DATE(S.VALUE,'sssss'),'HH24:MI:SS')
  673. FROM V$INSTANCE D, V$INSTANCE S
  674.    WHERE D.KEY = 'STARTUP TIME - JULIAN'
  675.    AND S.key = 'STARTUP TIME - SECONDS'
  676. " if ($oracle7);
  677.    $sql = "$copyright
  678. SELECT
  679.    TO_CHAR(STARTUP_TIME,'Day, Month DD, YYYY -  HH24:MI:SS')
  680. FROM V$INSTANCE
  681. " if ($oracle8);
  682.    $cursor = $dbh->prepare($sql);
  683.    $cursor->execute;
  684.    $foo = $cursor->fetchrow_array;
  685.    $cursor->finish;
  686.    $banner = "$banner<BR>Instance started on $foo<BR>";
  687.    logit("Exit subroutine getBanner");
  688.    return($banner);
  689. }
  690. sub showTSgraph {
  691.    logit("Enter subroutine showTSgraph");
  692.    my ($sql,$text,$link,$cursor,$tablespace,$bytesalloc,$bytesused,$bytesfree,$pctused,$pctfree);
  693.    refreshButton();
  694. # Show a graph of tablespace usage based on free space.
  695. # Print the page header
  696.    print <<"EOF";
  697. </CENTER>
  698. <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0 ALIGN=CENTER>
  699.   <TR>
  700.     <TD WIDTH=100%>
  701.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  702.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Tablespace name</TH>
  703.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Bytes allocated</TH>
  704.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Bytes used</TH>
  705.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Bytes free</TH>
  706.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>%Used graph</TH>
  707.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Percent used</TH>
  708.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Percent free</TH>
  709. EOF
  710.    $sql = "$copyright
  711. SELECT
  712.    DF.TABLESPACE_NAME                                           "Tablespace name",
  713.    TO_CHAR(DF.BYTES,'999,999,999,999')                          "Bytes allocated",
  714.    NVL(TO_CHAR(DF.BYTES-SUM(FS.BYTES),'999,999,999,999'),
  715.         TO_CHAR(DF.BYTES,'999,999,999,999'))                    "Bytes used",
  716.    NVL(TO_CHAR(SUM(FS.BYTES),'999,999,999,999'),0)              "Bytes free",
  717.    NVL(ROUND((DF.BYTES-SUM(FS.BYTES))*100/DF.BYTES),100)        "Percent used",
  718.    NVL(ROUND(SUM(FS.BYTES)*100/DF.BYTES),0)                     "Percent free"
  719. FROM DBA_FREE_SPACE FS,
  720.    (SELECT TABLESPACE_NAME, SUM(BYTES) BYTES FROM DBA_DATA_FILES GROUP BY
  721. TABLESPACE_NAME ) DF
  722. WHERE FS.TABLESPACE_NAME (+) = DF.TABLESPACE_NAME
  723. GROUP BY DF.TABLESPACE_NAME, DF.BYTES
  724. ORDER BY "Tablespace name"
  725. ";
  726. # Get the space allocation info
  727.    $cursor=$dbh->prepare($sql);
  728.    $cursor->execute;
  729.    while (($tablespace,$bytesalloc,$bytesused,$bytesfree,$pctused,$pctfree) = $cursor->fetchrow_array ) {
  730.       $bytesalloc=commify($bytesalloc);
  731.       $bytesused=commify($bytesused);
  732.       $bytesfree=commify($bytesfree);
  733.       print <<"EOF";
  734.         <TR>
  735.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><A HREF=$scriptname?database=$database&object_type=TSINFO&arg=$tablespace>$tablespace</A></TD>
  736.           <TD ALIGN=RIGHT BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$bytesalloc</TD>
  737.           <TD ALIGN=RIGHT BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$bytesused</TD>
  738.           <TD ALIGN=RIGHT BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$bytesfree</TD>
  739.           <TD BGCOLOR='$cellcolor' WIDTH=100>
  740.             <TABLE>
  741.               <TR>
  742.                 <TD WIDTH=$pctused BGCOLOR='$linkcolor'><BR></TD>
  743.               </TR>
  744.             </TABLE>
  745.           </TD>
  746.           <TD ALIGN=RIGHT BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$pctused%</TD>
  747.           <TD ALIGN=RIGHT BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$pctfree%</TD>
  748.         </TR>
  749. EOF
  750.    }
  751.    $cursor->finish;
  752. print <<"EOF";
  753.       </TABLE>
  754.     </TD>
  755.   </TR>
  756. </TABLE>
  757. EOF
  758.    logit("Exit subroutine showTSgraph");
  759. }
  760. sub killSession {
  761.    logit("Enter subroutine killSession");
  762.    $object_name = "Alter system kill session '$object_name,$schema'";
  763.   
  764.    runSQL();
  765.    logit("Exit subroutine killSession");
  766. }
  767. sub showSessionstats {
  768.    logit("Enter subroutine showSessionstats");
  769.    refreshButton();
  770.    my ($sql,$text,$link,$infotext,$count,$cursor,$open_cursors);
  771.    $sql = "$copyright
  772. SELECT 
  773.    SEQ# "Seq#",
  774.    EVENT "Event",
  775.    SECONDS_IN_WAIT "Seconds waiting"
  776. FROM V$SESSION_WAIT
  777.    WHERE SID = $schema
  778. ";
  779.    $text = "Session wait information.";
  780.    $link = "";
  781.    $infotext = "No info in V$SESSION_WAIT.";
  782.    DisplayTable($sql,$text,$link,$infotext);
  783.    $sql = "$copyright
  784. SELECT 
  785.    TO_CHAR(BLOCK_GETS,'999,999,999,999') "Block gets",
  786.    TO_CHAR(CONSISTENT_GETS,'999,999,999,999') "Consistent gets",
  787.    TO_CHAR(PHYSICAL_READS,'999,999,999,999') "Physical reads",
  788.    TO_CHAR(BLOCK_CHANGES,'999,999,999,999') "Block changes",
  789.    TO_CHAR(CONSISTENT_CHANGES,'999,999,999,999') "Consistent changes"
  790. FROM V$SESS_IO
  791.    WHERE SID = $schema
  792. ";
  793.    $text = "Session I/O information.";
  794.    $link = "";
  795.    $infotext = "No info in V$SESS_IO.";
  796.    DisplayTable($sql,$text,$link,$infotext);
  797. # Display output from V$SESSION_LONGOPS if Oracle8
  798.    if ($oracle8) {
  799.       $sql = "$copyright
  800. SELECT
  801.    SID "SID",
  802.    UPDATE_COUNT "Update count",
  803.    COMPNAM "Component",
  804.    OBJID "Object ID",
  805.    MSG "Message",
  806.    STEPSOFAR "Step sofar",
  807.    STEPTOTAL "Step total",
  808.    SOFAR "Work sofar",
  809.    TOTALWORK "Work total",
  810.    APPLICATION_DATA_1 "Data 1",
  811.    APPLICATION_DATA_2 "Data 2",
  812.    APPLICATION_DATA_3 "Data 3",
  813.    TO_CHAR(START_TIME,'Month DD, YYYY - HH24:MI') "Start time",
  814.    TO_CHAR(CURRENT_TIME,'Month DD, YYYY - HH24:MI') "Current time"
  815. FROM V$SESSION_LONGOPS
  816.    WHERE SID = $schema
  817. ";
  818.       if ($oracle8i) {
  819.          $sql = "$copyright
  820. SELECT
  821.    SID "SID",
  822.    OPNAME "Operation",
  823.    TARGET "Object",
  824.    TARGET_DESC "Description",
  825.    SOFAR "Work sofar",
  826.    TOTALWORK            "Work total",
  827.    UNITS "Units of measure",
  828.    TO_CHAR(START_TIME,'Month DD, YYYY - HH24:MI')       "Start time",
  829.    TO_CHAR(LAST_UPDATE_TIME,'Month DD, YYYY - HH24:MI') "Last update time",
  830.    TO_CHAR(ELAPSED_SECONDS,'999,999,999,999') "Elapsed seconds",
  831.    MESSAGE "Message"
  832. FROM V$SESSION_LONGOPS
  833.    WHERE SID = $schema
  834. ";
  835.       }
  836.       $text = "Long operation information.";
  837.       $link = "";
  838.       $infotext = "No info in V$SESSION_LONGOPS.";
  839.       DisplayTable($sql,$text,$link,$infotext);
  840.    }
  841.    $sql = "$copyright
  842. SELECT
  843.    SQL_TEXT  "SQL text"
  844. FROM V$OPEN_CURSOR
  845.    WHERE SID = $schema
  846. ";
  847.    $text = "Open cursors.";
  848.    $link = "";
  849.    $infotext = "No open cursors for this session.";
  850.    $count = DisplayTable($sql,$text,$link,$infotext);
  851.    $sql = "$copyright
  852. SELECT
  853.    VALUE
  854. FROM V$PARAMETER
  855.    WHERE NAME = 'open_cursors'
  856. ";
  857.    $cursor = $dbh->prepare($sql);
  858.    $cursor->execute;
  859.    $open_cursors = $cursor->fetchrow_array;
  860.    $cursor->finish;
  861.    if ($count == $open_cursors) {
  862.       message("Warning: This session has opened the maximum number of cursors allowed by a session ($count). You may need to increase the OPEN_CURSORS parameter. This may also be an indication that your application is not closing cursors properly.");
  863.    }
  864.    $sql = "$copyright
  865. SELECT 
  866.    OBJECT "Object name",
  867.    TYPE "Object type",
  868.    OWNER "Owner"
  869. FROM V$ACCESS
  870.    WHERE SID= $schema
  871. ";
  872.    $text = "Objects being accessed by SID $schema.";
  873.    $infotext = "This SID is not accessing any objects.";
  874.    ObjectTable($sql,$text,$infotext); 
  875. # Show session statistics for a particular SID
  876.    $sql = "$copyright
  877. SELECT 
  878.    A.NAME "Parameter name",
  879.    TO_CHAR(B.VALUE,'999,999,999,999,999') "Value",
  880.    DECODE(A.CLASS,
  881. 1,'User',
  882. 2,'Redo',
  883. 4,'Enqueue',
  884. 8,'Cache',
  885. 16,'OS',
  886. 32,'Parallel server',
  887. 64,'SQL',
  888. 128,'Debug') "Class"
  889. FROM V$STATNAME A, V$SESSTAT B
  890.    WHERE A.STATISTIC# = B.STATISTIC#
  891.    AND B.SID = $schema
  892.    AND B.VALUE > 0
  893. ORDER BY A.CLASS, A.NAME
  894. ";
  895.    $text = "Session statistics for SID '$schema'. Only non-zero values displayed.";
  896.    $link = "";
  897.    $infotext = "No current session statistics for SID $schema.";
  898.    DisplayTable($sql,$text,$link,$infotext);
  899.    logit("Exit subroutine showSessionstats");
  900. }
  901. sub showFilegraph {
  902.    logit("Enter subroutine showFilegraph");
  903.    my ($sql,$text,$link,$cursor,$totalreads);
  904.    my ($totalwrites,$file_name,$phyrds,$rdpct,$phywrts,$wrtpct);
  905.    refreshButton();
  906. # Show a graph of datafile activity based on physical writes.
  907.    $sql = "$copyright
  908. SELECT 
  909.    SUM(PHYRDS), SUM(PHYWRTS) 
  910. FROM V$FILESTAT
  911. ";
  912.    $cursor = $dbh->prepare($sql);
  913.    $cursor->execute;
  914.    ($totalreads,$totalwrites) = $cursor->fetchrow_array;
  915.    $cursor->finish;
  916.    $sql = "$copyright
  917. SELECT 
  918.    NAME "File name",
  919.    TO_CHAR(PHYRDS,'999,999,999,999') "Physical reads",
  920.    TO_CHAR(PHYRDS * 100 / $totalreads,'999') "Physical reads %",
  921.    TO_CHAR(PHYWRTS,'999,999,999,999') "Physical writes",
  922.    TO_CHAR(PHYWRTS * 100 / $totalwrites,'999') "Physical writes %"
  923. FROM V$DATAFILE DF, V$FILESTAT FS
  924.    WHERE DF.FILE# = FS.FILE#
  925. ORDER BY PHYWRTS DESC
  926. ";
  927.    print <<"EOF";
  928. Datafiles are ordered by physical writes, descending.<P>
  929. <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  930.   <TR>
  931.     <TD WIDTH=100%>
  932.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1 ALIGN=CENTER>
  933.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>File name</TH>
  934.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Reads</TH>
  935.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Percentage</TH>
  936.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Writes</TH>
  937.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Percentage</TH>
  938. EOF
  939.     
  940.    $cursor = $dbh->prepare($sql);
  941.    $cursor->execute;
  942.    while ( ($file_name,$phyrds,$rdpct,$phywrts,$wrtpct) = $cursor->fetchrow_array ) {
  943.       print <<"EOF";
  944.         <TR>
  945.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><A HREF=$scriptname?database=$database&object_type=DATAFILE&arg=$file_name>$file_name</A></TD>
  946.           <TD BGCOLOR='$cellcolor'>
  947.             <TABLE>
  948.               <TR>
  949.                 <TD WIDTH=$rdpct BGCOLOR='$linkcolor'><BR></TD>
  950.               </TR>
  951.             </TABLE>
  952.           </TD>
  953.           <TD ALIGN=RIGHT BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$rdpct%</TD>
  954.           <TD BGCOLOR='$cellcolor'>
  955.             <TABLE>
  956.               <TR>
  957.                 <TD WIDTH=$wrtpct BGCOLOR='$linkcolor'><BR></TD>
  958.               </TR>
  959.             </TABLE>
  960.           </TD>
  961.           <TD ALIGN=RIGHT BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$wrtpct%</TD>
  962.         </TR>
  963. EOF
  964.    }
  965.    $cursor->finish;
  966.    print <<"EOF";
  967.       </TABLE>
  968.     </TD>
  969.   </TR>
  970. </TABLE>
  971. EOF
  972.    logit("Exit subroutine showFilegraph");
  973. }
  974. sub showTSfilegraph {
  975.    logit("Enter subroutine showTSfilegraph");
  976.    my ($sql,$text,$link,$cursor,$totalreads);
  977.    my ($totalwrites,$file_name,$phyrds,$rdpct,$phywrts,$wrtpct);
  978.    my ($file_id,$bytes,$bytesused,$percent);
  979. # Show a graph of datafile activity based on physical writes.
  980.    $sql = "$copyright
  981. SELECT
  982.    SUM(PHYRDS), SUM(PHYWRTS)
  983. FROM V$FILESTAT
  984. ";
  985.    $cursor = $dbh->prepare($sql);
  986.    $cursor->execute;
  987.    ($totalreads,$totalwrites) = $cursor->fetchrow_array;
  988.    $cursor->finish;
  989.    $sql = "$copyright
  990. SELECT
  991.    NAME                                                 "File name",
  992.    TO_CHAR(PHYRDS,'999,999,999,999')                    "Physical reads",
  993.    TO_CHAR(PHYRDS * 100 / $totalreads,'999')            "Physical reads %",
  994.    TO_CHAR(PHYWRTS,'999,999,999,999')                   "Physical writes",
  995.    TO_CHAR(PHYWRTS * 100 / $totalwrites,'999')          "Physical writes %"
  996. FROM V$DATAFILE DF, V$FILESTAT FS
  997.    WHERE DF.FILE# = FS.FILE#
  998.    AND DF.FILE# IN
  999.    (SELECT FILE_ID
  1000. FROM DBA_DATA_FILES
  1001. WHERE TABLESPACE_NAME = '$schema')
  1002. ORDER BY PHYWRTS DESC
  1003. ";
  1004.    print <<"EOF";
  1005. Datafile I/O statistics.<BR>
  1006. Entries are ordered by physical writes, descending.<BR>
  1007. Percentage shown is in comparison to all other datafiles in database.<P>
  1008. <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  1009.   <TR>
  1010.     <TD WIDTH=100%>
  1011.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  1012.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>File name</TH>
  1013.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Reads</TH>
  1014.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Percentage</TH>
  1015.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Writes</TH>
  1016.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Percentage</TH>
  1017. EOF
  1018.    $cursor = $dbh->prepare($sql);
  1019.    $cursor->execute;
  1020.    while ( ($file_name,$phyrds,$rdpct,$phywrts,$wrtpct) = $cursor->fetchrow_array ) {
  1021.       print <<"EOF";
  1022.         <TR>  
  1023.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><A HREF=$scriptname?database=$database&object_type=DATAFILE&arg=$file_name>$file_name</A></TD>
  1024.           <TD BGCOLOR='$cellcolor' WIDTH=100>
  1025.             <TABLE>
  1026.               <TR>
  1027.                 <TD WIDTH=$rdpct BGCOLOR='$linkcolor'><BR></TD>
  1028.               </TR>
  1029.             </TABLE>
  1030.           </TD>
  1031.           <TD ALIGN=RIGHT BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$rdpct%</TD>
  1032.           <TD BGCOLOR='$cellcolor' WIDTH=100>
  1033.             <TABLE>
  1034.               <TR>
  1035.                 <TD WIDTH=$wrtpct BGCOLOR='$linkcolor'><BR></TD>
  1036.               </TR>
  1037.             </TABLE>
  1038.           </TD>
  1039.           <TD BGCOLOR='$cellcolor' ALIGN=RIGHT><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$wrtpct%</TD>
  1040.         </TR>
  1041. EOF
  1042.    }
  1043.    $cursor->finish;
  1044.    print <<"EOF";
  1045.       </TABLE>
  1046.     </TD>
  1047.   </TR>
  1048. </TABLE>
  1049. EOF
  1050.    
  1051.    print "<BR>n";
  1052. # Free space
  1053.    $sql = "$copyright
  1054. SELECT D.FILE_NAME                                                      "Filename",
  1055.        D.FILE_ID                                                        "File ID",
  1056.        TO_CHAR(D.BYTES,'999,999,999,999')                               "Bytes",
  1057.        TO_CHAR(SUM(E.BYTES),'999,999,999,999')                           "Bytes used",
  1058.        TO_CHAR(SUM(E.BYTES) / D.BYTES * 100,'999.99')                   "% used"
  1059. FROM   SYS.DBA_EXTENTS      E,
  1060.        SYS.DBA_DATA_FILES   D
  1061. WHERE  D.FILE_ID  = E.FILE_ID (+)
  1062. AND D.TABLESPACE_NAME = '$schema'
  1063. GROUP BY D.FILE_NAME, D.FILE_ID, D.BYTES
  1064. ";
  1065.    print <<"EOF";
  1066. Datafile free space.<P>
  1067. <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  1068.   <TR>
  1069.     <TD WIDTH=100%>
  1070.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  1071.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>File name</TH>
  1072.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>File ID</TH>
  1073.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Bytes</TH>
  1074.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Bytes used</TH>
  1075.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Graph</TH>
  1076.         <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Percentage full</TH>
  1077. EOF
  1078.    $cursor = $dbh->prepare($sql);
  1079.    $cursor->execute;
  1080.    while ( ($file_name,$file_id,$bytes,$bytesused,$percent) = $cursor->fetchrow_array ) {
  1081.       print <<"EOF";
  1082.         <TR>
  1083.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><A HREF=$scriptname?database=$database&object_type=DATAFILE&arg=$file_name>$file_name</A></TD>
  1084.           <TD ALIGN=RIGHT BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$file_id</TD>
  1085.           <TD ALIGN=RIGHT BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$bytes</TD>
  1086.           <TD ALIGN=RIGHT BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$bytesused</TD>
  1087.           <TD BGCOLOR='$cellcolor' WIDTH=100>
  1088.             <TABLE>
  1089.               <TR>
  1090.                 <TD WIDTH=$percent BGCOLOR='$linkcolor'><BR></TD>
  1091.               </TR>
  1092.             </TABLE>
  1093.           </TD>
  1094.           <TD ALIGN=RIGHT BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$percent%</TD>
  1095.         </TR>
  1096. EOF
  1097.    }
  1098.    $cursor->finish;
  1099.    print <<"EOF";
  1100.       </TABLE>
  1101.     </TD>
  1102.   </TR>
  1103. </TABLE>
  1104. EOF
  1105.    logit("Exit subroutine showTSfilegraph");
  1106. }
  1107. sub message {
  1108.    logit("Enter subroutine message");
  1109. # Print a message to the user
  1110.    my $message = shift;
  1111.    $message = "<FONT COLOR='$infocolor' SIZE='$fontsize' FACE='$font'>$message</FONT>";
  1112.    print "<P><B>$message</B></P>n";
  1113.    logit("Exit subroutine message");
  1114. }
  1115. sub text {
  1116.    logit("Enter subroutine text");
  1117. # Print a message to the user
  1118.    my $message = shift;
  1119.    $message = "<FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$message</FONT>";
  1120.    print "<P><B>$message</B></P>n";
  1121.    logit("Exit subroutine text");
  1122. }
  1123. sub commify {
  1124.    logit("Enter subroutine commify");
  1125. # Puts commas in a numeral
  1126.    my $text = reverse $_[0];
  1127.    $text =~ s/(ddd)(?=d)(?!d*.)/$1,/g;
  1128.    return scalar reverse $text;
  1129.    logit("Exit subroutine commify");
  1130. }
  1131. sub dbfileBlock {
  1132.    logit("Enter subroutine dbfileBlock");
  1133.    my ($sql,$text,,$infotext,$link);
  1134.    $sql = "$copyright
  1135. SELECT 
  1136.    SEGMENT_NAME,
  1137.    SEGMENT_TYPE,
  1138.    OWNER
  1139. FROM DBA_EXTENTS
  1140.    WHERE FILE_ID = (
  1141. SELECT FILE#
  1142.    FROM V$DATAFILE
  1143. WHERE NAME = '$object_name')
  1144.    AND $whereclause BETWEEN
  1145.       BLOCK_ID AND BLOCK_ID + BLOCKS - 1
  1146. ";
  1147.    $text = "Object occupying block $whereclause of file $object_name";
  1148.    $link = "";
  1149.    $infotext = "No object found";
  1150.    ObjectTable($sql,$text,$infotext);
  1151.    logit("Exit subroutine dbfileBlock");
  1152. }
  1153. sub statsPackAdmin {
  1154.    logit("Enter subroutine statsPackAdmin");
  1155.    my ($sql,$command);
  1156.    $command = $query->param('command');
  1157.    logit("   Command is $command");
  1158.    if ($command eq "snapshot") {
  1159. # Take a statsPack snapshot.
  1160.       message("Taking Statspack snapshot...");
  1161.       $sql = "
  1162. BEGIN
  1163.    STATSPACK.SNAP;
  1164. END;
  1165. ";
  1166.       $cursor = $dbh->prepare($sql);
  1167.       $cursor->execute;
  1168.       $cursor->finish;
  1169.       message("Statspack snapshot complete.");
  1170.    }
  1171.    if ($command eq "statsgroups") {
  1172. # Show groups of statistics between each database startup / shutdown.
  1173.       my ($start_snap_id,$end_snap_id,$startup_time,$numsnaps,$start_snap_time,$end_snap_time);
  1174.       text("Choose one or more groups of statistics to analyze and / or delete.");
  1175.       $sql = "
  1176. SELECT
  1177.    MIN(SNAP_ID),
  1178.    MAX(SNAP_ID),
  1179.    TO_CHAR(STARTUP_TIME,'Mon DD YYYY @ HH24:MI:SS'),
  1180.    TO_CHAR(COUNT(*),'999,999,999,999'),
  1181.    TO_CHAR(MIN(SNAP_TIME),'Mon DD YYYY @ HH24:MI:SS'),
  1182.    TO_CHAR(MAX(SNAP_TIME),'Mon DD YYYY @ HH24:MI:SS')
  1183. FROM STATS$SNAPSHOT
  1184.    WHERE INSTANCE_NUMBER = (
  1185. SELECT INSTANCE_NUMBER
  1186.    FROM V$INSTANCE
  1187. )
  1188.    GROUP BY STARTUP_TIME
  1189.    ORDER BY STARTUP_TIME
  1190. ";
  1191.       print <<"EOF";
  1192. <TABLE BORDER =0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  1193.   <FORM METHOD=POST ACTION=$scriptname>
  1194.     <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  1195.     <INPUT TYPE="SUBMIT" NAME="foobar" VALUE="Execute">
  1196.     <P>
  1197.     <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  1198.     <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  1199.     <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="STATSPACKADMIN">
  1200.     <INPUT TYPE="HIDDEN" NAME="command" VALUE="snapadmin">
  1201.   <TR>
  1202.     <TD WIDTH=100%>
  1203.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  1204.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Analyze</TH>
  1205.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Delete</TH>
  1206.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Startup time</TH>
  1207.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'># Snapshots</TH>
  1208.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>First snap</TH>
  1209.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Last snap</TH>
  1210. EOF
  1211.       $cursor = $dbh->prepare($sql);
  1212.       $cursor->execute;
  1213.       while (($start_snap_id,$end_snap_id,$startup_time,$numsnaps,$start_snap_time,$end_snap_time) = $cursor->fetchrow_array) {
  1214.          print <<"EOF";
  1215.         <TR>
  1216.           <TD ALIGN=CENTER BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><INPUT TYPE=CHECKBOX NAME=analyze~$start_snap_id~$end_snap_id></TD>
  1217.           <TD ALIGN=CENTER BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><INPUT TYPE=CHECKBOX NAME=delete~$start_snap_id~$end_snap_id></TD>
  1218.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$startup_time</TD>
  1219.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$numsnaps</TD>
  1220.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$start_snap_time</TD>
  1221.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$end_snap_time</TD>
  1222.         </TR>
  1223. EOF
  1224.       }
  1225.       $cursor->finish;
  1226.       print <<"EOF";
  1227.       </TABLE>
  1228.     </TD>
  1229.   </TR>
  1230.   </FORM>
  1231. </TABLE>
  1232. EOF
  1233.    }
  1234.    if ($command eq "snapadmin") {
  1235. # Analyze and / or delete snapshots.
  1236.       my (@params,$param,$start_snap_id,$end_snap_id);
  1237.       @params = $query->param;
  1238.       foreach $param(@params) {
  1239.          if ($param =~ /^analyze/) {
  1240.             $param =~ s/analyze~//;
  1241.             ($start_snap_id,$end_snap_id) = split("~", $param);
  1242.             logit("   Analyzing all snapshots from $start_snap_id to $end_snap_id"); 
  1243.             snapAnalyze($start_snap_id,$end_snap_id);
  1244.          }
  1245.          if ($param =~ /^delete/) {
  1246.             $param =~ s/delete~//;
  1247.             ($start_snap_id,$end_snap_id) = split("~", $param);
  1248.             logit("   Deleting all snapshots from $start_snap_id to $end_snap_id"); 
  1249.             snapDelete($start_snap_id,$end_snap_id);
  1250.          }
  1251.       }
  1252.    }
  1253.    logit("Exit subroutine statsPackAdmin");
  1254. }
  1255. sub snapAnalyze {
  1256.    logit("Enter subroutine snapAnalyze");
  1257.    my $start_snap_id = shift;
  1258.    my $end_snap_id = shift;
  1259.    my ($sql,$cursor,$startup_time,$instance_number,$text,$link,$infotext);
  1260.    my ($numsnaps,$start_snap_time,$end_snap_time);
  1261. # Get the instance number we are attached to. All queries
  1262. # should be based on instance number, due to OPS.
  1263.    $sql = "
  1264. SELECT
  1265.    INSTANCE_NUMBER
  1266. FROM V$INSTANCE
  1267. ";
  1268.    $cursor = $dbh->prepare($sql);
  1269.    $cursor->execute;
  1270.    $instance_number = $cursor->fetchrow_array;
  1271.    $cursor->finish;
  1272. # Check to make sure we are not spanning startup / shutdown
  1273. # with the range of snap_id's submitted. Blow up if we are.
  1274.    $sql = "
  1275. SELECT COUNT(DISTINCT STARTUP_TIME)
  1276.    FROM STATS$SNAPSHOT
  1277. WHERE INSTANCE_NUMBER = $instance_number
  1278. AND SNAP_ID BETWEEN $start_snap_id and $end_snap_id
  1279. ";
  1280.    if (recordCount($sql) > 1) {
  1281.       ErrorPage("You have specified a range that spans database startups. That is invalid.");
  1282.    }
  1283. # Get some values for informational purposes.
  1284.    $sql = "
  1285. SELECT
  1286.    TO_CHAR(STARTUP_TIME,'Mon DD YYYY @ HH24:MI:SS'),
  1287.    TO_CHAR(COUNT(*),'999,999,999,999'),
  1288.    TO_CHAR(MIN(SNAP_TIME),'Mon DD YYYY @ HH24:MI:SS'),
  1289.    TO_CHAR(MAX(SNAP_TIME),'Mon DD YYYY @ HH24:MI:SS')
  1290. FROM STATS$SNAPSHOT
  1291.    WHERE INSTANCE_NUMBER = $instance_number
  1292.    AND SNAP_ID BETWEEN $start_snap_id and $end_snap_id
  1293. GROUP BY STARTUP_TIME
  1294. ORDER BY STARTUP_TIME
  1295. ";
  1296.    $cursor = $dbh->prepare($sql);
  1297.    $cursor->execute;
  1298.    ($startup_time,$numsnaps,$start_snap_time,$end_snap_time) = $cursor->fetchrow_array;
  1299.    $cursor->finish;
  1300.    text("Snapshot analyzation for period spanning $start_snap_time to $end_snap_time ($numsnaps snapshots)<BR>Database: $database - Instance#: $instance_number");
  1301. # Tablespace I/O information.
  1302.    $sql = "
  1303. SELECT 
  1304.    A.TSNAME "Tablespace name",
  1305.    TO_CHAR(B.PHYRDS-A.PHYRDS,'999,999,999,999') "Phy. reads",
  1306.    TO_CHAR(B.PHYWRTS-A.PHYWRTS,'999,999,999,999') "Phy. writes"
  1307. FROM 
  1308.    (SELECT
  1309.       TSNAME,
  1310.       PHYRDS,
  1311.       PHYWRTS 
  1312.       FROM STATS$FILESTATXS
  1313.    WHERE INSTANCE_NUMBER = $instance_number
  1314.    AND SNAP_ID = $start_snap_id) A,
  1315.    (SELECT
  1316.       TSNAME,
  1317.       PHYRDS,
  1318.       PHYWRTS 
  1319.    FROM STATS$FILESTATXS
  1320.    WHERE INSTANCE_NUMBER = $instance_number
  1321.    AND SNAP_ID = $end_snap_id) B
  1322. WHERE A.TSNAME = B.TSNAME
  1323. ORDER BY 3 DESC , 2 DESC
  1324. ";
  1325.       $text = "Tablespace I/O statistics.";
  1326.       $link = "$scriptname?database=$database&object_type=TSINFO";
  1327.       $infotext = "No statistics found.";
  1328.       DisplayTable($sql,$text,$link,$infotext);
  1329. }
  1330. sub objectFragMap {
  1331.    logit("Enter subroutine objectFragMap");
  1332.    my ($sql1,$sql2,$cursor1,$cursor2,$file_name,$file_id,$bytes,$blocks);
  1333.    my ($block_id,$block_count,@block_ids,@block_counts,$counter,$extent_count);
  1334.    my ($collength,$colcounter,$arraycounter,$blockstart,$blockfinish,$i);
  1335.    my ($extentcolor,$foo,$partitioned,$iot_type);
  1336.    if ($oracle8) {
  1337.       $sql1 = "$copyright
  1338. SELECT
  1339.    PARTITIONED,
  1340.    IOT_TYPE
  1341. FROM DBA_TABLES
  1342.    WHERE OWNER = '$schema'
  1343.    AND TABLE_NAME = '$object_name'
  1344. ";
  1345.       $cursor1 = $dbh->prepare($sql1);
  1346.       $cursor1->execute;
  1347.       ($partitioned,$iot_type) = $cursor1->fetchrow_array;
  1348.       $cursor1->finish;
  1349.       if ($partitioned eq "YES") {
  1350.          message("Extent mapping for partitioned tables is not yet supported.");
  1351.          exit;
  1352.       }
  1353.       if ($iot_type eq "IOT") {
  1354.          message("Extent mapping for Index Organized Tables is not yet supported.");
  1355.          exit;
  1356.       }
  1357.    }
  1358.    if (checkPriv("EXECUTE ANY PROCEDURE") && checkPriv("ANALYZE ANY")) {
  1359.       logit("   Executing DBMS_SPACE.UNUSED_SPACE");
  1360.       $sql = "$copyright
  1361. BEGIN
  1362.    SYS.DBMS_SPACE.UNUSED_SPACE(?,?,?,?,?,?,?,?,?,?);
  1363. END;
  1364. ";
  1365.       my ($total_blocks,$total_bytes,$unused_blocks,$unused_bytes,$last_used_extent_file_id);
  1366.       my ($last_used_extent_block_id,$last_used_block,$usedpct,$unusedpct,$text,$link,$used_blocks);
  1367.       $cursor = $dbh->prepare($sql);
  1368.       $cursor->bind_param(1,"$schema");
  1369.       $cursor->bind_param(2,"$object_name");
  1370.       $cursor->bind_param(3,"TABLE");
  1371.       $cursor->bind_param_inout(4, $total_blocks,80);
  1372.       $cursor->bind_param_inout(5, $total_bytes,80);
  1373.       $cursor->bind_param_inout(6, $unused_blocks,80);
  1374.       $cursor->bind_param_inout(7, $unused_bytes,80);
  1375.       $cursor->bind_param_inout(8, $last_used_extent_file_id,80);
  1376.       $cursor->bind_param_inout(9, $last_used_extent_block_id,80);
  1377.       $cursor->bind_param_inout(10,$last_used_block,80);
  1378.       $cursor->execute;
  1379.       $cursor->finish;
  1380.       logit("   Stored procedure returned :nTotal blocks: $total_blocksnTotal bytes: $total_bytesnUnused blocks: $unused_blocksnUnused bytes: $unused_bytesnLast used extent file id: $last_used_extent_file_idnlast used extent block ID: $last_used_extent_block_id");
  1381.       $sql = "$copyright
  1382. SELECT
  1383.    TO_CHAR($total_blocks,'999,999,999,999') "Total blocks",
  1384.    TO_CHAR($total_bytes,'999,999,999,999') "Total bytes",
  1385.    TO_CHAR($unused_blocks,'999,999,999,999') "Unused blocks",
  1386.    TO_CHAR($unused_bytes,'999,999,999,999') "Unused bytes",
  1387.    TO_CHAR($last_used_extent_file_id,'999,999,999,999') "Last used extent file ID",
  1388.    TO_CHAR($last_used_extent_block_id,'999,999,999,999') "Last used extent block_id"
  1389. FROM DUAL
  1390. ";
  1391.       $text = "Real-time space usage via DBMS_SPACE.";
  1392.       $link = "";
  1393.       DisplayTable($sql,$text,$link);
  1394.       $used_blocks = $total_blocks-$unused_blocks;
  1395.       $usedpct = int(($used_blocks/$total_blocks)*100);
  1396.       $unusedpct = 100-$usedpct;
  1397.       $unused_blocks = commify($unused_blocks);
  1398.       $unused_bytes = commify($unused_bytes);
  1399.       text("$usedpct% of the allocated space for this table is being used. There are $unused_blocks blocks above the highwater mark, totaling $unused_bytes bytes which are allocated, but have never been used since table creation or the last truncate.") unless $DBI::errstr;
  1400.    }
  1401.    text("</CENTER>Extent mapping for object $schema.$object_name. This may be a long running query for large objects with many extents, or for very large databases.");
  1402. # Get a list of files that this object spans.
  1403.    $sql1 = "$copyright
  1404. SELECT 
  1405.    FILE_NAME,
  1406.    FILE_ID,
  1407.    TO_CHAR(BYTES,'999,999,999,999'),
  1408.    BLOCKS
  1409. FROM DBA_DATA_FILES
  1410.    WHERE FILE_ID IN (
  1411. SELECT DISTINCT
  1412.    FILE_ID
  1413. FROM DBA_EXTENTS
  1414.    WHERE SEGMENT_NAME = '$object_name'
  1415.    AND OWNER = '$schema'
  1416. )
  1417.    ORDER BY FILE_ID
  1418. ";
  1419.    $cursor1=$dbh->prepare($sql1) or ErrorPage("$DBI::errstr");
  1420.    $cursor1->execute;
  1421.    text("Extents are shown in alternating white / blue so that they can be distinguished from each other. Blocks shown in green are either free or allocated by other objects.");
  1422. # Loop through the datafiles.
  1423.    while (($file_name,$file_id,$bytes,$blocks) = $cursor1->fetchrow_array) {
  1424.       
  1425.       logit("   Working on file $file_name for object $schema.$object_name");
  1426.       undef @block_ids;
  1427.       undef @block_counts;
  1428.       $sql2 = "$copyright
  1429. SELECT BLOCK_ID, BLOCKS
  1430.    FROM DBA_EXTENTS
  1431. WHERE FILE_ID = '$file_id'
  1432.    AND SEGMENT_NAME = '$object_name'
  1433.    AND OWNER = '$schema'
  1434.    ORDER BY BLOCK_ID
  1435. ";
  1436.       $cursor2=$dbh->prepare($sql2);
  1437.       $cursor2->execute;
  1438.       while (($block_id, $block_count) = $cursor2->fetchrow_array) {
  1439.          push @block_ids, $block_id;
  1440.          push @block_counts, $block_count;
  1441.       }
  1442.       $cursor2->finish;
  1443.       $extent_count = $#block_ids+1;
  1444.       logit("   Extent count is $extent_count");
  1445. # This is for serious debugging only. Major output for objects with
  1446. # many extents.
  1447. #      for ($counter = 0; $counter <= $#block_ids; $counter++) {
  1448. #         logit("   Segment: $object_name Owner: $schema");
  1449. #         logit("   Block_id: $block_ids[$counter] Count: $block_counts[$counter]");
  1450. #      }
  1451. # Create the image
  1452.       $collength = 150;
  1453.       $colcounter = 0;
  1454.       $arraycounter = 0;
  1455.       text("</CENTER>Extent map for $schema.$object_name, datafile $file_name<BR>File is $bytes bytes ($blocks blocks of $db_block_size bytes)<BR>$schema.$object_name has $extent_count extent(s) in this datafile");
  1456.       print "<FONT SIZE=1><B></CENTER>n";
  1457.       print "<FONT COLOR=GREEN>";
  1458.       $blockstart = $block_ids[$arraycounter];
  1459.       $blockfinish = $blockstart+$block_counts[$arraycounter]-1;
  1460.       logit("   Block start = $blockstart: Block finish = $blockfinish");
  1461. # Go from 0 to the number of blocks in the datafile
  1462.       for ($i = 1; $i < $blocks; $i++) {
  1463. # If $i is equal to the start block_id of the extent, turn the font blue.
  1464.          if ($i == $blockstart) {
  1465.             if ($foo) {
  1466.                $extentcolor = "BLUE";
  1467.                $foo--;
  1468.             } else {
  1469.                $extentcolor = "WHITE";
  1470.                $foo++
  1471.             }
  1472.             print "<FONT COLOR=$extentcolor>";
  1473. #            logit("   i reached blockstart $blockstart: i = $i");
  1474.          }
  1475.          print "I";
  1476.          if ($i == $blockfinish) {
  1477.             print "<FONT COLOR=GREEN>";
  1478. #            logit("   i reached blockfinish $blockfinish: i = $i");
  1479.             $arraycounter++;
  1480.             if ($arraycounter > $#block_ids) {
  1481.                logit("   End of array reached at element $arraycounter.");
  1482.                $blockstart = $blocks+1;
  1483.                $blockfinish      = $blockstart+$block_counts[$arraycounter];
  1484.             } else {
  1485.                $blockstart       = $block_ids[$arraycounter];
  1486.                $blockfinish      = $blockstart+$block_counts[$arraycounter]-1;
  1487.             }
  1488.          }
  1489.          $colcounter++;
  1490.          if ($colcounter == $collength) {
  1491.            print "<BR>n";
  1492.            $colcounter = 0;
  1493.          }
  1494.       }
  1495.    }
  1496.    print "</FONT><CENTER></B>";
  1497.    print "<FONT FACE="$font" SIZE="$fontsize" COLOR="$fontcolor">n";
  1498.    $cursor1->finish;
  1499.    logit("Exit subroutine objectFragMap");
  1500. }
  1501. sub fragMap {
  1502.    logit("Enter subroutine fragMap");
  1503. # Creates a datafile fragmentation map, 
  1504. # showing used and unused blocks.
  1505.    my ($sql,$sql1,$cursor,$cursor1,$file_id,$blocks);
  1506.    my ($collength,$width,$height,$hstart,$vstart);
  1507.    my ($blockused,$blockfree,$x,$y,$numblocks);
  1508.    my ($colcounter,$image,$id,$i,$pointer,$length);
  1509.    my ($block_id,$counter,$file_name,$bytes);
  1510.    my (@datafiles);
  1511.    if ($whereclause eq "datafile") {
  1512.       push @datafiles, $object_name;
  1513.    }
  1514.    if ($whereclause eq "tablespace") {
  1515.       $sql = "$copyright
  1516. SELECT
  1517.    FILE_NAME
  1518. FROM DBA_DATA_FILES
  1519.    WHERE TABLESPACE_NAME = '$object_name'
  1520. ORDER BY FILE_NAME
  1521. ";
  1522.       $cursor=$dbh->prepare($sql);
  1523.       $cursor->execute;
  1524.       while ($file_name = $cursor->fetchrow_array) {
  1525.          push @datafiles, $file_name;
  1526.       }
  1527.       $cursor->finish;
  1528.    }
  1529. # Loop through the datafiles.
  1530.    foreach $file_name(@datafiles) {
  1531.       $sql = "$copyright
  1532. SELECT 
  1533.    FILE_ID, 
  1534.    TO_CHAR(BYTES,'999,999,999,999'), 
  1535.    BLOCKS
  1536. FROM DBA_DATA_FILES 
  1537.    WHERE FILE_NAME = '$file_name'
  1538. ";
  1539.       $cursor=$dbh->prepare($sql);
  1540.       $cursor->execute;
  1541.       while (($file_id,$bytes,$blocks) = $cursor->fetchrow_array) {
  1542.       
  1543.          $sql1 = "$copyright
  1544. SELECT BLOCK_ID, BLOCKS
  1545.    FROM DBA_EXTENTS
  1546. WHERE FILE_ID = '$file_id'
  1547.    ORDER BY BLOCK_ID
  1548. ";
  1549.          $cursor1=$dbh->prepare($sql1);
  1550.          $cursor1->execute;
  1551.       
  1552. # Create the image
  1553.          $collength = 150;
  1554.          $colcounter = 1;
  1555.          $counter = 1;
  1556.          $pointer = 1;
  1557.          $hstart = 0;
  1558.          $x = 0;
  1559.          text("</CENTER>Fragmentation map for datafile $file_name<BR>File is $bytes bytes ($blocks blocks of $db_block_size bytes)");
  1560.          print "<FONT SIZE=1><B></CENTER>n";
  1561.          while (($block_id,$numblocks) = $cursor1->fetchrow) {
  1562.             print "<FONT COLOR=GREEN>";
  1563.             for ($i = $pointer; $i < $block_id; $i++) {
  1564.                print "I";
  1565.                $x = $x+1;
  1566.                if ($x == $collength) {
  1567.                  print "<BR>n";
  1568.                  $x = $hstart;
  1569.                  $colcounter=0;
  1570.                }
  1571.                $pointer++;
  1572.             }
  1573.             print "<FONT COLOR=RED>";
  1574.             for ($i = 1; $i <= $numblocks; $i++ ) {
  1575.                print "I";
  1576.                $x = $x+1;
  1577.                if ($x == $collength+$hstart) {
  1578.                  print "<BR>n";
  1579.                  $x = $hstart;
  1580.                  $colcounter=0;
  1581.                }
  1582.                $counter = $block_id + $numblocks + 1;
  1583.                $pointer++;
  1584.             }
  1585.          }
  1586.          $cursor1->finish;
  1587.          print "<FONT COLOR=GREEN>";
  1588.          for ($i = $pointer; $i <= $blocks; $i++) {
  1589.             print "I";
  1590.             $x = $x+1;
  1591.             if ($x == $collength+$hstart) {
  1592.                print "<BR>n";
  1593.                $x = $hstart;
  1594.                $colcounter=0;
  1595.             }
  1596.             $pointer++;
  1597.          }
  1598.       }
  1599.       $cursor->finish;
  1600.    print "</FONT><CENTER></B>";
  1601.    print "<FONT FACE="$font" SIZE="$fontsize" COLOR="$fontcolor">n";
  1602.    }
  1603.    logit("Exit subroutine fragMap");
  1604. }
  1605. sub about {
  1606.    logit("Enter subroutine about");
  1607. # Give me a pat on the back. :)
  1608.    my ($title,$heading,$fontsize,$encstring);
  1609.    $title = "Oracletool v$VERSION";
  1610.    $heading = "</CENTER><B>Thanks for using Oracletool!</B><BR>";
  1611.    if ($encryption_enabled) {
  1612.       $encstring = "Cookie encryption is enabled, level $encryption_enabled of 2.";
  1613.     } else {
  1614.       $encstring = "Cookie encryption is not enabled.";
  1615.    }
  1616.    Header($title,$heading,$font,$fontsize,$fontcolor,$bgcolor);
  1617. print <<"EOF";
  1618. <BR>
  1619. <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  1620.   <TR>
  1621.     <TD WIDTH=100%>
  1622.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  1623.         <TR>
  1624.           <TD BGCOLOR='$cellcolor'>
  1625.             <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  1626.             oracletool.pl version $VERSION<BR>
  1627.             <HR ALIGN=LEFT WIDTH=75% NOSHADE SIZE=1>
  1628.             $encstring<BR>
  1629.             Your theme is set to $theme.
  1630.           </TD>
  1631.         </TR>
  1632.       </TABLE>
  1633.     </TD>
  1634.   </TR>
  1635. </TABLE>
  1636. <BR>
  1637. Written and maintained by Adam vonNieda in Kansas, USA.<P>
  1638. Copyright 1998, 1999, 2000 Adam vonNieda<BR>
  1639. You may distribute under the terms of either the GNU General Public<BR>
  1640. License or the Artistic License, as specified in the Perl README file,<BR>
  1641. with the exception that it cannot be placed on a CD-ROM or similar media<BR>
  1642. for commercial distribution without the prior approval of the author.<P>
  1643. Home site: <A HREF="http://www.oracletool.com">http://www.oracletool.com</A><BR>
  1644. Join the announcement <A HREF="http://www.oracletool.com/mailinglist.html">announcement list</A>
  1645. &nbsp;(one, maybe two emails a month)..<BR><BR>
  1646. Questions, comments, bug reports, and suggestions are encouraged!<BR>
  1647. Tell me what to do to make it better!<BR>
  1648. Drop me a note at <A HREF="mailto:adam@oracletool.com">adam@oracletool.com</A>.<BR><BR>
  1649. I'd like to thank everyone (too many to name) who has contributed to this<BR>
  1650. project be it through suggestions, criticism, or code contributions.<BR>
  1651. Oracletool is a useful product because of you! 
  1652. EOF
  1653.    logit("Exit subroutine about");
  1654.    exit;
  1655. }
  1656. sub advrep {
  1657.    logit("Enter subroutine advrep");
  1658. # Find out if this server is an advanced replication
  1659. # master server.
  1660.    my ($sql,$cursor,$count);
  1661.    $count = 0;
  1662.    $sql = "$copyright
  1663. SELECT
  1664.    COUNT(*)
  1665. FROM DBA_REPGROUP
  1666. ";
  1667.    $cursor=$dbh->prepare($sql);
  1668.    if ($cursor) {
  1669.       $cursor->execute;
  1670.       $count=$cursor->fetchrow;
  1671.       $cursor->finish;
  1672.       return($count);
  1673.    } else {
  1674.       return(0);
  1675.    }
  1676.    logit("Exit subroutine advrep");
  1677. }
  1678. sub repmaster {
  1679.    logit("Enter subroutine repmaster");
  1680. # Find out if this server is the master for
  1681. # replication.
  1682.    my ($sql,$cursor,$count);
  1683.    $sql = "$copyright
  1684. SELECT 
  1685.    COUNT(*) 
  1686. FROM DBA_REGISTERED_SNAPSHOTS
  1687. ";
  1688.    $cursor=$dbh->prepare($sql);
  1689.    $cursor->execute;
  1690.    $count=$cursor->fetchrow;
  1691.    $cursor->finish;
  1692.    return $count;
  1693.    logit("Exit subroutine repmaster");
  1694. }
  1695. sub repsnapshot {
  1696.    logit("Enter subroutine repsnapshot");
  1697. # Find out if this instance has snapshots
  1698. # replicated from a master.
  1699.    my ($sql,$cursor,$count);
  1700.    $sql = "$copyright
  1701. SELECT 
  1702.    COUNT(*) 
  1703. FROM DBA_SNAPSHOTS
  1704. ";
  1705.    $cursor=$dbh->prepare($sql);
  1706.    $cursor->execute;
  1707.    $count=$cursor->fetchrow;
  1708.    $cursor->finish;
  1709.    return $count;
  1710.    logit("Exit subroutine repsnapshot");
  1711. }
  1712. sub rmanCatalogExists {
  1713.    logit("Enter subroutine rmanCatalogExists");
  1714. # Find out if there is one or more Recovery Manager
  1715. # catalogs in this database. This pertains to 
  1716. # Oracle8 and above only.
  1717.    my ($sql,$cursor,$count);
  1718.    $sql = "$copyright
  1719. SELECT
  1720.    COUNT(*)
  1721. FROM DBA_TABLES
  1722.    WHERE TABLE_NAME = 'RCVER'
  1723. ";
  1724.    $cursor = $dbh->prepare($sql);
  1725.    $cursor->execute;
  1726.    $count = $cursor->fetchrow_array;
  1727.    $cursor->finish;
  1728.    return($count); 
  1729.    logit("Exit subroutine rmanCatalogExists");
  1730. }
  1731. sub backupsFound {
  1732.    logit("Enter subroutine backupsFound");
  1733.    my ($sql,$cursor,$count);
  1734.    $sql = "$copyright
  1735. SELECT
  1736.    COUNT(*)
  1737. FROM V$BACKUP_DATAFILE
  1738. ";
  1739.    $cursor = $dbh->prepare($sql);
  1740.    $cursor->execute;
  1741.    $count = $cursor->fetchrow_array;
  1742.    $cursor->finish;
  1743.    return($count); 
  1744.    logit("Exit subroutine backupsFound");
  1745. }
  1746. sub parallel {
  1747.    logit("Enter subroutine parallel");
  1748. # Find out if this is a parallel database.
  1749. # Oracle8 only. I'm not going to cover Oracle7
  1750. # parallel databases at this time.
  1751.    if ($oracle8) {
  1752.       my $sql = "$copyright
  1753. SELECT VALUE
  1754.    FROM V$PARAMETER
  1755. WHERE NAME = 'parallel_server'
  1756. ";
  1757.       my $cursor = $dbh->prepare($sql);
  1758.       $cursor->execute;
  1759.       my $foo = $cursor->fetchrow_array;
  1760.       $cursor->finish;
  1761.       if ( $foo eq "TRUE" ) {
  1762.          return 1; 
  1763.        } else {
  1764.          return 0; 
  1765.       }
  1766.     } else {
  1767.    return 0;
  1768.    }
  1769.    logit("Exit subroutine parallel");
  1770. }
  1771. sub DisplayGraph {
  1772.    logit("Enter subroutine DisplayGraph");
  1773.    my $graphtype = shift;
  1774.    my $object_name = shift;
  1775.    my $text = shift;
  1776.    my ($file,$tablespace_name,$rgif,$vgif,$sql,$cursor);
  1777.    if ($graphtype eq "dbfile") {
  1778.       $sql = "$copyright
  1779. SELECT TABLESPACE_NAME 
  1780.    FROM DBA_DATA_FILES
  1781. WHERE FILE_NAME = '$object_name'
  1782. ";
  1783.       $cursor=$dbh->prepare($sql);
  1784.       $cursor->execute;
  1785.       $tablespace_name = $cursor->fetchrow_array;
  1786.       $cursor->finish;
  1787.       $file = basename($object_name);
  1788.       $rgif = "$ENV{DOCUMENT_ROOT}/$repository/$database/$tablespace_name/$file.gif";
  1789.       $vgif = "$repository/$database/$tablespace_name/$file.gif";
  1790.    }
  1791.    if ($graphtype eq "sessions") {
  1792.       $rgif = "$ENV{DOCUMENT_ROOT}/$repository/$database/sessions.gif";
  1793.       $vgif = "$repository/$database/sessions.gif";
  1794.    }
  1795. # If the image file does not exist, return.
  1796.    if (! -e $rgif) {
  1797.       return (1);
  1798.    }
  1799.    print <<"EOF" if defined ($text);
  1800. <P><B>$text</B>
  1801. EOF
  1802. print "<IMG SRC=$vgif>n";
  1803.    logit("Exit subroutine DisplayGraph");
  1804. }
  1805. sub showGrantButton {
  1806.    logit("Enter subroutine showGrantButton");
  1807.    my ($sql,$cursor,$count);
  1808.    $sql = "$copyright
  1809. SELECT COUNT(*)
  1810.    FROM DBA_TAB_PRIVS
  1811. WHERE TABLE_NAME = '$object_name'
  1812. AND OWNER = '$schema'
  1813. ";
  1814.    $cursor=$dbh->prepare($sql);
  1815.    $cursor->execute;
  1816.    $count = $cursor->fetchrow_array;
  1817.    $cursor->finish;
  1818.    if ($count > 0 ) {
  1819.    print <<"EOF";
  1820. <BR>
  1821. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0>
  1822.   <TR>
  1823.     <TD ALIGN=CENTER>
  1824.       <FORM METHOD="GET" ACTION="$scriptname">
  1825.         <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  1826.         <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  1827.         <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="OBJECTGRANTS">
  1828.         <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  1829.         <INPUT TYPE="HIDDEN" NAME="arg" VALUE="$object_name">
  1830.         <INPUT TYPE="SUBMIT" NAME="tablerows" VALUE="Display ($count) grants">
  1831.       </FORM>
  1832.     </TD>
  1833.   </TR>
  1834. </TABLE>
  1835. EOF
  1836.    }
  1837.    logit("Exit subroutine showGrantButton");
  1838.    return($count);
  1839. }
  1840. sub showObjectGrants {
  1841.    logit("Enter subroutine showObjectGrants");
  1842.    my ($sql,$cursor,$text,$link);
  1843.    $sql = "$copyright
  1844. SELECT
  1845.    GRANTOR "Grantor",
  1846.    GRANTEE "Grantee",
  1847.    PRIVILEGE "Privilege",
  1848.    GRANTABLE "Grantable"
  1849. FROM DBA_TAB_PRIVS
  1850.    WHERE TABLE_NAME = '$object_name'
  1851.    AND OWNER = '$schema'
  1852. ORDER BY GRANTEE, PRIVILEGE
  1853. ";
  1854.    $text = "Grants for object $schema.$object_name";
  1855.    $link = "";
  1856.    DisplayTable($sql,$text,$link);
  1857.    logit("Exit subroutine showObjectGrants");
  1858. }
  1859. sub Button {
  1860.    logit("Enter subroutine Button");
  1861.    my $href = shift;
  1862.    my $text = shift;
  1863.    my $bgcolor = shift;
  1864.    my $align = shift;
  1865.    my $pixels = shift;
  1866.    $align = "CENTER" unless $align;
  1867.    $pixels = 100 unless $pixels;
  1868.    print <<"EOF";
  1869.       </FONT>
  1870.       <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0 ALIGN=$align WIDTH=$pixels>
  1871.         <TR>
  1872.           <TD VALIGN="TOP" WIDTH=100%>
  1873.             <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1 WIDTH=100%>
  1874.               <TR ALIGN="CENTER">
  1875.                 <TD BGCOLOR='$cellcolor'><B><FONT SIZE="$menufontsize">
  1876. EOF
  1877.    if ($href) {
  1878.       print "<A HREF=$href>$text</A>";
  1879.     } else {
  1880.       print "<FONT COLOR=$bordercolor>$text</FONT>";
  1881.    }
  1882. print <<"EOF";
  1883.                 </B></TD>
  1884.               </TR>
  1885.             </TABLE>
  1886.           </TD>
  1887.         </TR>
  1888.       </TABLE>
  1889.       <TABLE WIDTH="100" CELLPADDING="1" CELLSPACING="0" BORDER="0">
  1890.         <TD></TD>
  1891.       </TABLE>
  1892. EOF
  1893.    logit("Exit subroutine Button");
  1894. }
  1895. sub showIndextype {
  1896.    logit("Enter subroutine showIndextype");
  1897.    my ($sql,$text,$link);
  1898. # General indextype info
  1899.    $sql = "$copyright
  1900. SELECT
  1901.    INDEXTYPE_NAME "Indextype name",
  1902.    IMPLEMENTATION_SCHEMA "Implementation schema",
  1903.    IMPLEMENTATION_NAME "Implementation name",
  1904.    IMPLEMENTATION_VERSION "Implementation version",
  1905.    TO_CHAR(NUMBER_OF_OPERATORS,'999,999,999,999') "# operators"
  1906. FROM DBA_INDEXTYPES
  1907.    WHERE INDEXTYPE_NAME = '$object_name'
  1908.    AND OWNER = '$schema'
  1909. ";
  1910.    $text = "";
  1911.    $link = "";
  1912.    DisplayTable($sql,$text,$link);
  1913.    $sql = "$copyright
  1914. SELECT 
  1915.    INDEXTYPE_NAME "Indextype name",
  1916.    BINDING# "Binding#",
  1917.    OPERATOR_NAME "Operator name"
  1918. FROM DBA_INDEXTYPE_OPERATORS
  1919.    WHERE INDEXTYPE_NAME = '$object_name'
  1920.    AND OWNER = '$schema'
  1921.    ORDER BY BINDING#
  1922. ";
  1923.    $text = "Indextype operators";
  1924.    $link = "";
  1925.    DisplayTable($sql,$text,$link);
  1926.    logit("Exit subroutine showIndextype");
  1927. }
  1928. sub showLibrary {
  1929.    logit("Enter subroutine showLibrary");
  1930.    my ($sql,$text,$link);
  1931. # General library info
  1932.    $sql = "$copyright
  1933. SELECT
  1934.    LIBRARY_NAME "Library name",
  1935.    FILE_SPEC "Filename",
  1936.    DECODE(DYNAMIC,'N','No','Y','Yes') "Dynamic?",
  1937.    STATUS "Status"
  1938. FROM DBA_LIBRARIES
  1939.    WHERE LIBRARY_NAME = '$object_name'
  1940.    AND OWNER = '$schema'
  1941. ";
  1942.    $text = "";
  1943.    $link = "";
  1944.    DisplayTable($sql,$text,$link);
  1945.    logit("Exit subroutine showLibrary");
  1946. }
  1947. sub showOperator {
  1948.    logit("Enter subroutine showOperator");
  1949.    my ($sql,$text,$link);
  1950. # General operator info
  1951.    $sql = "$copyright
  1952. SELECT
  1953.    OPERATOR_NAME "Operator name",
  1954.    TO_CHAR(NUMBER_OF_BINDS,'999,999,999,999') "# Binds"
  1955. FROM DBA_OPERATORS
  1956.    WHERE OPERATOR_NAME = '$object_name'
  1957.    AND OWNER = '$schema'
  1958. ";
  1959.    $text = "";
  1960.    $link = "";
  1961.    DisplayTable($sql,$text,$link);
  1962.    $sql = "$copyright
  1963. SELECT 
  1964.    BINDING# "Binding#",
  1965.    FUNCTION_NAME "Function name",
  1966.    RETURN_SCHEMA "Return schema",
  1967.    RETURN_TYPE "Return type",
  1968.    IMPLEMENTATION_TYPE_SCHEMA "Imp type schema",
  1969.    IMPLEMENTATION_TYPE "Imp type"
  1970. FROM DBA_OPBINDINGS
  1971.    WHERE OPERATOR_NAME = '$object_name'
  1972.    AND OWNER = '$schema'
  1973.    ORDER BY BINDING#
  1974. ";
  1975.    $text = "Bindings";
  1976.    $link = "";
  1977.    DisplayTable($sql,$text,$link);
  1978.    logit("Exit subroutine showOperator");
  1979. }
  1980. sub showQueue {
  1981.    logit("Enter subroutine showQueue");
  1982.    my ($sql,$text,$link);
  1983. # General queue info
  1984.    $sql = "$copyright
  1985. SELECT
  1986.    NAME "Name",
  1987.    QUEUE_TABLE "Queue table",
  1988.    QID "ID",
  1989.    QUEUE_TYPE "Type",
  1990.    TO_CHAR(MAX_RETRIES,'999,999,999,999') "Max retries",
  1991.    TO_CHAR(RETRY_DELAY,'999,999,999,999') "Retry delay",
  1992.    ENQUEUE_ENABLED "Enqueue enabled?",
  1993.    DEQUEUE_ENABLED "Dequeue enabled?",
  1994.    RETENTION "Retention",
  1995.    USER_COMMENT "User comment"
  1996. FROM DBA_QUEUES
  1997.    WHERE NAME = '$object_name'
  1998.    AND OWNER = '$schema'
  1999. ";
  2000.    $text = "";
  2001.    $link = "";
  2002.    DisplayTable($sql,$text,$link);
  2003.    logit("Exit subroutine showQueue");
  2004. }
  2005. sub recordCount {
  2006.    logit("Enter subroutine recordCount");
  2007.    my ($sql,$cursor,$record,$count);
  2008.    
  2009.    $sql = shift;
  2010.    $cursor = $dbh->prepare($sql) or logit("   $DBI::errstr");
  2011.    $cursor->execute;
  2012.    while ($record = $cursor->fetchrow_array) {
  2013.       $count++;
  2014.    }
  2015.    $cursor->finish;
  2016.    logit("   Count = $count");
  2017.    logit("   Enter subroutine recordCount");
  2018.    logit("Exit subroutine recordCount");
  2019.    return($count);
  2020. }
  2021. sub rmanBackups {
  2022.    logit("Enter subroutine rmanBackups");
  2023.    my ($sql,$cursor,$text,$infotext,$link,$command,$count);
  2024.    my ($recid,$stamp,$set_stamp,$filenum,$name,$inc_level);
  2025.    my ($ckpt_chng,$ckpt_time,$mar_cor,$med_cor,$log_cor);
  2026.    my ($df_blocks,$blocks,$comp_time,$rowcount,$backupfile_record);
  2027.    my ($set_count,@backupfile_array);
  2028.    $command = $query->param('command') || shift;
  2029. # Commands:
  2030. #   menu: Show menu
  2031. #   datafiles_added: Show datafiles added since last backup
  2032. #   last_backup: Show most recent information about backups of existing datafiles
  2033. #   unrecoverable_datafiles: Show datafiles which have had UNRECOVERABLE operations performed
  2034. # on them since their last backup.
  2035.    if ($command eq "menu") {
  2036.          text("All backup information in this section is taken from the controlfiles.");
  2037.          Button("$scriptname?database=$database&object_type=RMANBACKUPS&command=last_backup TARGET=body","Current datafile backups","$headingcolor","CENTER","200");
  2038. # Check for datafiles added since last backup..
  2039.       $sql = "$copyright
  2040. SELECT
  2041.    COUNT(*)
  2042. FROM V$DATAFILE
  2043.    WHERE CREATION_CHANGE# NOT IN (
  2044. SELECT DISTINCT CREATION_CHANGE# 
  2045.    FROM V$BACKUP_DATAFILE
  2046. )
  2047. ";
  2048.       $count = recordCount($sql);
  2049.       if ($count) {
  2050.          Button("$scriptname?database=$database&object_type=RMANBACKUPS&command=datafiles_added TARGET=body","Datafiles never backed up","$headingcolor","CENTER","200");
  2051.       }
  2052. # Check for datafiles which are backed up but have been dropped.
  2053. # No good, can't get filename.
  2054. #      $sql = "$copyright
  2055. #SELECT
  2056. #   COUNT(*)
  2057. #FROM V$BACKUP_DATAFILE
  2058. #   WHERE CREATION_CHANGE#
  2059. #NOT IN (SELECT CREATION_CHANGE#
  2060. #FROM V$DATAFILE)
  2061. #";
  2062. #      $count = recordCount($sql);
  2063. #      if ($count) {
  2064. #         Button("$scriptname?database=$database&object_type=RMANBACKUPS&command=datafiles_dropped TARGET=body","Datafiles backed up but dropped","$headingcolor","CENTER","200");
  2065. #      }
  2066. # Check for files which have had unrecoverable operations run against them.
  2067. # This does not mean you can't recover the file, it means that you cant 
  2068. # recover the transactions if you lose the datafile.
  2069.       $sql = "$copyright
  2070. SELECT COUNT(*)
  2071. FROM
  2072.    V$DATAFILE VD,
  2073. (
  2074. SELECT BD.CREATION_CHANGE#, MAX(BD.COMPLETION_TIME) COMPLETION_TIME
  2075. FROM
  2076.    V$BACKUP_DATAFILE BD
  2077. GROUP BY BD.CREATION_CHANGE#
  2078. ) VBD
  2079. WHERE VBD.CREATION_CHANGE# = VD.CREATION_CHANGE#
  2080. AND VD.UNRECOVERABLE_TIME > VBD.COMPLETION_TIME
  2081. ";
  2082.       $count = recordCount($sql);
  2083.       if ($count) {
  2084.          Button("$scriptname?database=$database&object_type=RMANBACKUPS&command=unrecoverable_datafiles TARGET=body","Unrecoverable datafiles","$headingcolor","CENTER","200");
  2085.       }
  2086.    }
  2087.    if ($command eq "datafiles_added") {
  2088.       $sql = "
  2089. SELECT
  2090.    NAME "Filename",
  2091.    TO_CHAR(CREATION_TIME,'Mon DD YYYY @ HH24:MI:SS') "Date created"
  2092. FROM V$DATAFILE
  2093.    WHERE CREATION_CHANGE# NOT IN (
  2094. SELECT DISTINCT CREATION_CHANGE# FROM V$BACKUP_DATAFILE
  2095. )
  2096. ";
  2097.       $text = "Datafile(s) which have been added but not backed up.";
  2098.       $link = "$scriptname?database=$database&object_type=DATAFILE";
  2099.       $infotext = "No datafiles have been added since the last backup.";
  2100.       DisplayTable($sql,$text,$link,$infotext);
  2101.    }
  2102. #   if ($command eq "datafiles_dropped") {
  2103. #      $sql = "$copyright
  2104. #SELECT
  2105. #   NAME
  2106. #FROM V$DATAFILE
  2107. #   WHERE CREATION_CHANGE# IN (
  2108. #SELECT CREATION_CHANGE#
  2109. #FROM V$BACKUP_DATAFILE
  2110. #   WHERE CREATION_CHANGE#
  2111. #NOT IN (SELECT CREATION_CHANGE#
  2112. #FROM V$DATAFILE))
  2113. #";
  2114. #      $text = "Datafiles which are backed up but have been dropped.";
  2115. #      $link = "$scriptname?database=$database&object_type=DATAFILE";
  2116. #      $infotext = "";
  2117. #      DisplayTable($sql,$text,$link,$infotext);
  2118. #   }
  2119.    if ($command eq "last_backup") {
  2120.       $sql = "
  2121. SELECT
  2122. VDF.NAME "Filename",
  2123. TO_CHAR(VBD.COMPLETION_TIME,'Mon DD YYYY @ HH24:MI:SS') "Completion time",
  2124. TO_CHAR(VBD.DATAFILE_BLOCKS*VBD.BLOCK_SIZE,'999,999,999,999') "File size",
  2125. TO_CHAR(VBD.BLOCKS*VBD.BLOCK_SIZE,'999,999,999,999') "Bytes written",
  2126. VBD.INCREMENTAL_LEVEL "Level",
  2127. VBD.CHECKPOINT_CHANGE# "Ckpt change#",
  2128. TO_CHAR(VBD.CHECKPOINT_TIME,'Mon DD YYYY @ HH24:MI:SS') "Checkpoint time",
  2129. VBD.MARKED_CORRUPT "Mrkd crpt",
  2130. VBD.MEDIA_CORRUPT "Media crpt",
  2131. VBD.LOGICALLY_CORRUPT "Lgcl crpt"
  2132. FROM V$BACKUP_DATAFILE VBD, V$DATAFILE VDF,
  2133. (SELECT
  2134.    CREATION_CHANGE#,
  2135.    MAX(COMPLETION_TIME) COMPLETION_TIME
  2136. FROM V$BACKUP_DATAFILE
  2137.    WHERE CREATION_CHANGE# IN (
  2138. SELECT CREATION_CHANGE# FROM V$DATAFILE)
  2139. GROUP BY CREATION_CHANGE#
  2140. ) QUERY1
  2141.    WHERE VBD.CREATION_CHANGE# = VDF.CREATION_CHANGE#
  2142.    AND VBD.CREATION_CHANGE# = QUERY1.CREATION_CHANGE#
  2143.    AND VBD.COMPLETION_TIME = QUERY1.COMPLETION_TIME
  2144.    ORDER BY 2 DESC, 5 DESC, 6 DESC
  2145. ";
  2146.       $text = "Most recent backup information for existing datafiles.";
  2147.       $link = "$scriptname?database=$database&object_type=DATAFILE";
  2148.       $infotext = "No backups found.";
  2149.       $count = DisplayTable($sql,$text,$link,$infotext);
  2150.    }
  2151.    if ($command eq "unrecoverable_datafiles") {
  2152.       $sql = "$copyright
  2153. SELECT VD.NAME
  2154. FROM
  2155.    V$DATAFILE VD,
  2156. (
  2157. SELECT BD.CREATION_CHANGE#, MAX(BD.COMPLETION_TIME) COMPLETION_TIME
  2158. FROM
  2159.    V$BACKUP_DATAFILE BD
  2160. GROUP BY BD.CREATION_CHANGE#
  2161. ) VBD
  2162. WHERE VBD.CREATION_CHANGE# = VD.CREATION_CHANGE#
  2163. AND VD.UNRECOVERABLE_TIME > VBD.COMPLETION_TIME
  2164. ";
  2165.       $text = "Datafiles which have had UNRECOVERABLE operations performed on them since their last backup.";
  2166.       $link = "$scriptname?database=$database&object_type=RMANBACKUPS&command=datafile";
  2167.       $infotext = "";
  2168.       $count = DisplayTable($sql,$text,$link,$infotext);
  2169.    }
  2170.    logit("Exit subroutine rmanBackups");
  2171. }
  2172. sub rmanCatalogQuery {
  2173.    logit("Enter subroutine rmanCatalogQuery");
  2174.    my ($sql1,$cursor1,$sql2,$cursor2,$owner,$count,$version,$command);
  2175.    my ($text,$infotext,$link);
  2176.    $command = $query->param('command') || "";
  2177.    logit("   Command is $command");
  2178.    if ($command eq "listdbs") {
  2179.       # List the databases contained in the catalog
  2180.       $sql = "$copyright
  2181. SELECT
  2182.    NAME "DB name",
  2183.    TO_CHAR(RESETLOGS_TIME,'Month DD, YYYY - HH24:MI') "Last resetlogs"
  2184. FROM $schema.RC_DATABASE
  2185. ";
  2186.       $text = "Database(s) registered in this catalog.";
  2187.       $infotext = "RMAN catalog owned by $schema contains no databases.";
  2188.       $link = "$scriptname?database=$database&schema=$schema&object_type=RMANCATALOGQUERY&command=listbackups";
  2189.       DisplayTable($sql,$text,$link,$infotext);
  2190.    }
  2191.    if ($command eq "listbackups") {
  2192.       
  2193.       # List information about the database chosen.
  2194.       $sql = "$copyright
  2195. SELECT
  2196.    RESYNC_TYPE                                          "Resync type",
  2197.    TO_CHAR(RESYNC_TIME,'Month DD, YYYY - HH24:MI')      "Resync time"
  2198. FROM $schema.RC_RESYNC
  2199.    WHERE DB_NAME = '$object_name'
  2200. ORDER BY 2
  2201. ";
  2202.       $text = "Resyncs for database $object_name.";
  2203.       $infotext = "No resyncs for database $object_name on record.";
  2204.       $link = "";
  2205.       DisplayTable($sql,$text,$link,$infotext);
  2206.    }
  2207.    unless ($command) {
  2208.       # No command is passed, so show the catalog(s)
  2209.       text("The following RMAN catalog(s) exist.");
  2210.       print << "EOF";
  2211. <TABLE BORDER =0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  2212.   <TR>
  2213.     <TD WIDTH=100%>
  2214.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  2215.         <TH BGCOLOR='$headingcolor' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Catalog owner</A></TH>
  2216.         <TH BGCOLOR='$headingcolor' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Catalog version</TH>
  2217. EOF
  2218.       $sql1 = "$copyright
  2219. SELECT
  2220.    OWNER
  2221. FROM DBA_TABLES
  2222.    WHERE TABLE_NAME = 'RCVER'
  2223. ";
  2224.       $cursor1 = $dbh->prepare($sql1);
  2225.       $cursor1->execute;
  2226.       while ($owner = $cursor1->fetchrow_array) {
  2227.          $sql2 = "$copyright
  2228. SELECT
  2229.    VERSION
  2230. FROM $owner.RCVER
  2231. ";
  2232.          $cursor2 = $dbh->prepare($sql2);
  2233.          next unless ($cursor2);
  2234.          $cursor2->execute;
  2235.          $version = $cursor2->fetchrow_array;
  2236.          $cursor2->finish;
  2237.          logit("   Seems to be a RMAN catalog, version $version owned by $owner");
  2238.          print "<TR><TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><A HREF=$scriptname?database=$database&object_type=RMANCATALOGQUERY&schema=$owner&command=listdbs>$owner</A></TD>n";
  2239.          print "<TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$version</TD></TR>n";
  2240.       }
  2241.       $cursor1->finish;
  2242.       print <<"EOF";
  2243.       </TABLE>
  2244.     </TD>
  2245.   </TR>
  2246. </TABLE>
  2247. EOF
  2248.    }
  2249.    logit("Exit subroutine rmanCatalogQuery");
  2250. }
  2251. sub dbAdmin {
  2252.    logit("Enter subroutine dbAdmin");
  2253.    my ($sql,$cursor,$username,$password,$deftablespace,$temptablespace,$profile);
  2254.    my ($cascade,$copyuser,$bytes,$tablespace_name,$privilege,$granted_role);
  2255.    my ($admin_option,$default_role,@params,$param,$sid,$serial,$obj_name);
  2256.    my ($owner,$object_type,$object_id,$foo,@audits,$audit,$audits,$by,$whenever);
  2257.    my ($whenevercount,@objects,@privileges,@users,$moresql,$users,$wheneversql);
  2258.    my ($status,$text,@default_roles,$roles);
  2259.    $username = $query->param('username') || "";
  2260.    $password = $query->param('password') || "";
  2261.    $deftablespace = $query->param('deftablespace') || "";
  2262.    $temptablespace = $query->param('temptablespace') || "";
  2263.    $profile = $query->param('profile') || "";
  2264.    $cascade = $query->param('cascade') || "";
  2265.    $copyuser = $query->param('copyuser') || "";
  2266.    logit("   Command is $object_name");
  2267.    if ($object_name eq "killsessions") {
  2268.       @params = $query->param;
  2269.       foreach $param(@params) {
  2270.          if ($param =~ /^killsession/) {
  2271.             $param =~ s/killsession_//;
  2272.             ($sid,$serial) = split("~", $param);
  2273.             runSQL("ALTER SYSTEM KILL SESSION '$sid,$serial'");
  2274.          }
  2275.       }
  2276.    }
  2277.    if ($object_name eq "alter_rollbacks") {
  2278.       my $shrinkto = $query->param('shrinkto');
  2279.       my ($rbs,$command);
  2280.       logit("   Shrinkto value is set to: $shrinkto");
  2281.       @params = $query->param;
  2282.       foreach $param(@params) {
  2283.          logit("   Param = $param");
  2284.          if ($param =~ /^alter/) {
  2285.             ($foo,$rbs,$command) = split("~", $param);
  2286.             logit("   RBS: $rbs, Command: $command");
  2287.             if ($command eq "online") {
  2288.                runSQL("ALTER ROLLBACK SEGMENT $rbs ONLINE");
  2289.             }
  2290.             if ($command eq "offline") {
  2291.                runSQL("ALTER ROLLBACK SEGMENT $rbs OFFLINE");
  2292.             }
  2293.             if ($command eq "shrink") {
  2294.                if ($shrinkto) { 
  2295.                   runSQL("ALTER ROLLBACK SEGMENT $rbs SHRINK TO $shrinkto");
  2296.                } else {
  2297.                   runSQL("ALTER ROLLBACK SEGMENT $rbs SHRINK");
  2298.                }
  2299.             }
  2300.          }
  2301.       }
  2302.    }
  2303.    if ($object_name eq "dependencies") {
  2304.       my ($link,$infotext);
  2305.       @params = $query->param;
  2306.       foreach $param(@params) {
  2307.          logit("   Param = $param");
  2308.          if ($param =~ /^dependency/) {
  2309.             ($foo,$object_id) = split("~", $param);
  2310.             $sql = "
  2311. SELECT
  2312.    OBJECT_NAME,
  2313.    OBJECT_TYPE,
  2314.    OWNER
  2315. FROM DBA_OBJECTS
  2316.    WHERE OBJECT_ID = $object_id
  2317. ";
  2318.             $cursor = $dbh->prepare($sql);
  2319.             $cursor->execute;
  2320.             ($object_name,$object_type,$owner) = $cursor->fetchrow_array;
  2321.             $cursor->finish;
  2322.             $sql = "
  2323. SELECT 
  2324.    OBJECT_NAME "Object name", 
  2325.    OBJECT_TYPE "Object type", 
  2326.    OWNER "Owner" 
  2327. FROM DBA_OBJECTS
  2328.    WHERE OBJECT_ID IN (
  2329. SELECT 
  2330.    P_OBJ#
  2331. FROM SYS.DEPENDENCY$ 
  2332.    WHERE D_OBJ# = $object_id
  2333.    )
  2334. ORDER BY 3,2,1
  2335. ";
  2336.             $text = "$object_type $owner.$object_name depends on the following objects.";
  2337.             $link = "";
  2338.             $infotext = "$object_type $owner.$object_name has no dependencies on other objects.";
  2339.             ObjectTable($sql,$text,$infotext);
  2340. $sql = "
  2341. SELECT 
  2342.    OBJECT_NAME "Object name", 
  2343.    OBJECT_TYPE "Object type", 
  2344.    OWNER "Owner" 
  2345. FROM DBA_OBJECTS          
  2346.    WHERE OBJECT_ID IN (
  2347. SELECT 
  2348.    D_OBJ#
  2349. FROM SYS.DEPENDENCY$ 
  2350.    WHERE P_OBJ# = $object_id
  2351.    )
  2352. ORDER BY 3,2,1
  2353. ";
  2354.             $text = "The following objects depend on $object_type $owner.$object_name.";
  2355.             $link = "";
  2356.             $infotext = "No other objects have dependencies on $object_type $owner.$object_name.";
  2357.             ObjectTable($sql,$text,$infotext);
  2358.             print "<HR WIDTH=75%>";
  2359.          }
  2360.       }
  2361.    }
  2362.    if ($object_name eq "compile") {
  2363.       @params = $query->param;
  2364.       logit("   Params: @params");
  2365.       foreach $param(@params) {
  2366.          if ($param =~ /^compile_/) {
  2367.             logit("   Param: $param");
  2368.             ($foo,$object_id) = split("_", $param);
  2369.             logit("   Object_id = $object_id");
  2370.             $sql = "$copyright
  2371. SELECT
  2372.    OBJECT_TYPE,
  2373.    OWNER,
  2374.    OBJECT_NAME
  2375. FROM DBA_OBJECTS 
  2376.    WHERE OBJECT_ID = $object_id
  2377. ";
  2378.             $cursor = $dbh->prepare($sql);
  2379.             $cursor->execute;
  2380.             ($object_type,$owner,$obj_name) = $cursor->fetchrow_array;
  2381.             $cursor->finish;
  2382.             if ($object_type eq "PACKAGE BODY") {
  2383.                runSQL("ALTER PACKAGE $owner.$obj_name COMPILE BODY");
  2384.             } else {
  2385.                runSQL("ALTER $object_type $owner.$obj_name COMPILE");
  2386.             }
  2387.             logit("   Object $object_type $owner.$obj_name COMPILE");
  2388.             $sql = "$copyright
  2389. SELECT
  2390.    STATUS
  2391. FROM DBA_OBJECTS
  2392.    WHERE OBJECT_NAME = '$obj_name'
  2393.    AND OBJECT_TYPE = '$object_type'
  2394.    AND OWNER = '$owner'
  2395. ";
  2396.             $cursor = $dbh->prepare($sql);
  2397.             $cursor->execute;
  2398.             $status = $cursor->fetchrow_array;
  2399.             $cursor->finish;
  2400.             if ($status eq "INVALID") {
  2401.                $sql = "$copyright
  2402. SELECT
  2403.    LINE         "Line",
  2404.    POSITION     "Position",
  2405.    TEXT         "Text"
  2406. FROM DBA_ERRORS
  2407.    WHERE NAME = '$obj_name'
  2408.    AND TYPE = '$object_type'
  2409.    AND OWNER = '$owner'
  2410. ORDER BY SEQUENCE
  2411. ";
  2412.                $text = "Object $owner.$obj_name still has errors..";
  2413.                DisplayTable($sql,$text);
  2414.                print "<P>n";
  2415.             }
  2416.          }
  2417.       }
  2418.    }
  2419.    if ($object_name eq "changepassword") {
  2420.       $sql = "
  2421. ALTER USER $username IDENTIFIED BY $password
  2422. ";
  2423.       runSQL("$sql");
  2424.    }
  2425.    if ($object_name eq "createuser") {
  2426.       $sql = "
  2427. CREATE USER $username 
  2428.    IDENTIFIED BY $password
  2429.    DEFAULT TABLESPACE $deftablespace
  2430.    TEMPORARY TABLESPACE $temptablespace
  2431.    PROFILE $profile
  2432. ";
  2433.       runSQL("$sql");
  2434.    }
  2435.    if ($object_name eq "dropuser") {
  2436.       if ($cascade) {
  2437.          $sql = "
  2438. DROP USER $username CASCADE
  2439. ";
  2440.        } else {
  2441.       $sql = "
  2442. DROP USER $username
  2443. ";
  2444.       }
  2445.       runSQL("$sql");
  2446.    }
  2447.    if ($object_name eq "removestmtaudits") {
  2448.       @params = $query->param;
  2449.       foreach $param(@params) {
  2450.          if ($param =~ /^removeaudit/) {
  2451.             $param =~ s/removeaudit_//;
  2452.             ($privilege,$username) = split("~", $param);
  2453.             $privilege =~ s/+/ /g;
  2454.             if ($username) {
  2455.                $sql = "
  2456. NOAUDIT $privilege BY $username
  2457. ";
  2458.             } else {
  2459.                $sql = "
  2460. NOAUDIT $privilege
  2461. ";
  2462.             }
  2463.             logit("   Remove audits: $sql");
  2464.             runSQL($sql);
  2465.          }
  2466.       }
  2467.    }
  2468.    if ($object_name eq "removeobjaudits") {
  2469.       @params = $query->param;
  2470.       foreach $param(@params) {
  2471.          if ($param =~ /^removeaudit/) {
  2472.             $param =~ s/removeaudit_//;
  2473.             ($owner,$obj_name) = split("~", $param);
  2474.             $sql = "
  2475. NOAUDIT ALL ON $owner.$obj_name
  2476. ";
  2477.             logit("   Remove audits: $sql");
  2478.             runSQL($sql);
  2479.          }
  2480.       }
  2481.    }
  2482.    if ($object_name eq "dostatementaudits") {
  2483.       @params = $query->param;
  2484.       logit("   Params: @params");
  2485.       @users = $query->param('users');
  2486.       $users = join(",", @users);
  2487.       logit("   Users: $users");
  2488.       @privileges = $query->param('privilege');
  2489.       logit("   Privileges: @privileges");
  2490.       unless (@privileges) {
  2491.          message("You must select at least one privilege..");
  2492.          Footer();
  2493.       }
  2494.       $by = $query->param('by');
  2495.       if ($users) {
  2496.          $moresql = " BY $users";
  2497.       }
  2498.       if ($by) {
  2499.          $moresql .= " BY $by";
  2500.       }
  2501.       foreach $param(@params) {
  2502.          if ($param =~ /whenever~/) {
  2503.             $whenevercount++; 
  2504.             ($foo,$whenever) = split("~", $param);
  2505.             if ($whenever eq "NOTSUCCESSFUL") {
  2506.                $wheneversql = " WHENEVER NOT SUCCESSFUL";
  2507.             } 
  2508.             if ($whenever eq "SUCCESSFUL") {
  2509.                $wheneversql = " WHENEVER SUCCESSFUL";
  2510.             }
  2511.          }
  2512.       }
  2513.       if ($whenevercount == 1) {
  2514.          $moresql .= $wheneversql;
  2515.       }
  2516.       foreach $privilege (@privileges) {
  2517.          $sql = "
  2518. AUDIT $privilege$moresql
  2519. ";
  2520.          logit("   $sql");
  2521.          runSQL("$sql");
  2522.       }
  2523.       
  2524.    }
  2525.    if ($object_name eq "doschemaaudits") {
  2526.       @params = $query->param;
  2527.       logit("   Params: @params");
  2528.       @objects = $query->param('object');
  2529.       logit("   Objects: @objects");
  2530.       $by = $query->param('by');
  2531.       foreach $param(@params) {
  2532.          if ($param =~ /audit~/) {
  2533.             ($foo,$audit) = split("~", $param);
  2534.             push @audits, $audit;
  2535.          }
  2536.          if ($param =~ /whenever~/) {
  2537.             $whenevercount++;
  2538.             ($foo,$whenever) = split("~", $param);
  2539.             if ($whenever eq "NOTSUCCESSFUL") {
  2540.                $whenever = "NOT SUCCESSFUL";
  2541.             }
  2542.          }
  2543.       }
  2544.       logit("   Audits = @audits");
  2545.       $audits = join(",", @audits);
  2546.       foreach $obj_name(@objects) {
  2547.          if ($whenevercount != 1) {
  2548.             $sql = "
  2549. AUDIT $audits ON $obj_name BY $by
  2550. ";
  2551.          } else {
  2552.             $sql = "
  2553. AUDIT $audits ON $obj_name BY $by WHENEVER $whenever
  2554. ";
  2555.          }
  2556.          logit("   $sql");
  2557.          runSQL("$sql");
  2558.       }
  2559.    }
  2560.    if ($object_name eq "copyuser") {
  2561.       $sql = "
  2562. SELECT 
  2563.    DEFAULT_TABLESPACE,
  2564.    TEMPORARY_TABLESPACE,
  2565.    PROFILE
  2566. FROM DBA_USERS 
  2567.    WHERE USERNAME = '$copyuser'
  2568. ";
  2569.       $cursor=$dbh->prepare($sql);
  2570.       $cursor->execute;
  2571.       ($deftablespace,$temptablespace,$profile) = $cursor->fetchrow;
  2572.       $cursor->finish;
  2573.       $sql = "
  2574. CREATE USER $username
  2575.    IDENTIFIED BY $password
  2576.    DEFAULT TABLESPACE $deftablespace
  2577.    TEMPORARY TABLESPACE $temptablespace
  2578.    PROFILE $profile
  2579. ";
  2580.       runSQL("$sql");
  2581.       $sql = "
  2582. SELECT
  2583.    MAX_BYTES,
  2584.    TABLESPACE_NAME
  2585. FROM DBA_TS_QUOTAS
  2586.    WHERE USERNAME = '$copyuser'
  2587. ";
  2588.       $cursor=$dbh->prepare($sql);
  2589.       $cursor->execute;
  2590.       while (($bytes,$tablespace_name) = $cursor->fetchrow) {
  2591.          $bytes = "UNLIMITED" if ($bytes eq "-1");
  2592.          $sql = "
  2593. ALTER USER $username QUOTA $bytes on $tablespace_name
  2594. ";
  2595.          runSQL("$sql");
  2596.       }
  2597.       $sql = "$copyright
  2598. SELECT
  2599.    GRANTED_ROLE,
  2600.    ADMIN_OPTION,
  2601.    DEFAULT_ROLE
  2602. FROM DBA_ROLE_PRIVS
  2603.    WHERE GRANTEE = '$copyuser'
  2604. ";
  2605.       $cursor = $dbh->prepare($sql);
  2606.       $cursor->execute;
  2607.       while (($granted_role,$admin_option,$default_role) = $cursor->fetchrow) {
  2608.          $sql = "
  2609. GRANT $granted_role TO $username
  2610. ";
  2611.          $sql .= " WITH ADMIN OPTION" if ($admin_option eq "YES");
  2612.          runSQL("$sql");
  2613.          if ($default_role eq "YES") {
  2614.             push @default_roles, $granted_role;
  2615.          }
  2616.       }
  2617.       $cursor->finish;
  2618.       if (@default_roles) {
  2619.          $roles = join(",",@default_roles);
  2620.          runSQL("ALTER USER $username DEFAULT ROLE $roles");
  2621.       }
  2622.       $sql = "$copyright
  2623. SELECT
  2624.    PRIVILEGE,
  2625.    ADMIN_OPTION
  2626. FROM DBA_SYS_PRIVS 
  2627.    WHERE GRANTEE = '$copyuser'
  2628. "; 
  2629.       $cursor = $dbh->prepare($sql);
  2630.       $cursor->execute;
  2631.       while (($privilege,$admin_option) = $cursor->fetchrow) {
  2632.          $sql = "
  2633. GRANT $privilege TO $username
  2634. ";
  2635.          $sql .= " WITH ADMIN OPTION" if ($admin_option eq "YES");
  2636.          runSQL("$sql");
  2637.       }
  2638.    }
  2639.    logit("Exit subroutine dbAdmin");
  2640. }
  2641. sub enterCreateUser {
  2642.    logit("Enter subroutine enterCreateUser");
  2643.    my ($sql,$cursor,$tablespace_name,$username,$profile);
  2644.    text("</CENTER>Reset a user password.");
  2645.    print <<"EOF";
  2646. <B>
  2647. </CENTER>
  2648. <FORM METHOD=POST ACTION=$scriptname>
  2649.   <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  2650.   <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  2651.   <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="DBADMIN">
  2652.   <INPUT TYPE="HIDDEN" NAME="arg" VALUE="changepassword">
  2653. Alter user 
  2654.   <SELECT SIZE=1 NAME=username>
  2655. EOF
  2656.    $sql = "$copyright
  2657. SELECT
  2658.   USERNAME
  2659. FROM DBA_USERS
  2660.    ORDER BY USERNAME
  2661. ";
  2662.    $cursor = $dbh->prepare($sql);
  2663.    $cursor->execute;
  2664.    while ($username = $cursor->fetchrow) {
  2665.       print "    <OPTION>$usernamen";
  2666.    }
  2667.    $cursor->finish;
  2668.    print <<"EOF";
  2669.   </SELECT>
  2670.    &nbsp;&nbsp;identified by
  2671.   <INPUT TYPE=PASSWORD MAXLENGTH=30 SIZE=10 NAME=password>
  2672.   <P>
  2673.   <INPUT TYPE="SUBMIT" NAME="foobar" VALUE="Reset password">
  2674. </FORM>
  2675. <P><HR WIDTH=90%><P>
  2676. <CENTER>
  2677. EOF
  2678.    text("</CENTER>Create a user.");
  2679.    print <<"EOF";
  2680. </CENTER>
  2681. <FORM METHOD=POST ACTION=$scriptname>
  2682.   <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  2683.   <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  2684.   <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="DBADMIN">
  2685.   <INPUT TYPE="HIDDEN" NAME="arg" VALUE="createuser">
  2686.    Create user
  2687.   <INPUT TYPE=TEXT MAXLENGTH=30 SIZE=10 NAME=username>
  2688.    &nbsp;&nbsp;identified by
  2689.   <INPUT TYPE=PASSWORD MAXLENGTH=30 SIZE=10 NAME=password>
  2690.    &nbsp;&nbsp;default tablespace
  2691. EOF
  2692.    print <<"EOF";
  2693.   <SELECT SIZE=1 NAME=deftablespace>
  2694. EOF
  2695.    $sql = "$copyright
  2696. SELECT 
  2697.   TABLESPACE_NAME 
  2698. FROM DBA_TABLESPACES
  2699.    ORDER BY TABLESPACE_NAME
  2700. ";
  2701.    $cursor = $dbh->prepare($sql);
  2702.    $cursor->execute;
  2703.    while ($tablespace_name = $cursor->fetchrow) {
  2704.       print "    <OPTION>$tablespace_namen";
  2705.    }
  2706.    $cursor->finish;
  2707.    print <<"EOF";
  2708.   </SELECT>
  2709.   <BR>temporary tablespace
  2710.   <SELECT SIZE=1 NAME=temptablespace>
  2711. EOF
  2712.    $sql = "$copyright
  2713. SELECT 
  2714.   TABLESPACE_NAME 
  2715. FROM DBA_TABLESPACES
  2716.    ORDER BY TABLESPACE_NAME
  2717. ";
  2718.    $cursor = $dbh->prepare($sql);
  2719.    $cursor->execute;
  2720.    while ($tablespace_name = $cursor->fetchrow) {
  2721.       print "    <OPTION>$tablespace_namen";
  2722.    }
  2723.    $cursor->finish;
  2724.    print <<"EOF";
  2725.   </SELECT>
  2726.   &nbsp;&nbsp;profile
  2727.   <SELECT SIZE=1 NAME=profile>
  2728. EOF
  2729.    $sql = "$copyright
  2730. SELECT 
  2731.   DISTINCT PROFILE
  2732. FROM DBA_PROFILES
  2733.    ORDER BY PROFILE
  2734. ";
  2735.    $cursor = $dbh->prepare($sql);
  2736.    $cursor->execute;
  2737.    while ($profile = $cursor->fetchrow) {
  2738.       print "    <OPTION>$profilen";
  2739.    }
  2740.    $cursor->finish;
  2741.    print <<"EOF";
  2742.   </SELECT>
  2743.   <P>
  2744.   <INPUT TYPE="SUBMIT" NAME="tablerows" VALUE="Create user">
  2745. </FORM>
  2746. <P><HR WIDTH=90%><P>
  2747. <CENTER>
  2748. EOF
  2749.    text("</CENTER>Create a user "like" another user.<BR>This will give the new user the same quotas, profile, default and temporary tablespace, roles, and system privileges as the selected user.");
  2750.    print <<"EOF";
  2751. </CENTER>
  2752. <FORM METHOD=POST ACTION=$scriptname>
  2753.   <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  2754.   <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  2755.   <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="DBADMIN">
  2756.   <INPUT TYPE="HIDDEN" NAME="arg" VALUE="copyuser">
  2757.    Create user
  2758.   <INPUT TYPE=TEXT MAXLENGTH=30 SIZE=10 NAME=username>
  2759.    &nbsp;&nbsp;identified by
  2760.   <INPUT TYPE=PASSWORD MAXLENGTH=30 SIZE=10 NAME=password>
  2761.   &nbsp;&nbsp;same as
  2762.   <SELECT SIZE=1 NAME=copyuser>
  2763. EOF
  2764.    $sql = "$copyright
  2765. SELECT
  2766.   USERNAME
  2767. FROM DBA_USERS
  2768.    ORDER BY USERNAME
  2769. ";
  2770.    $cursor = $dbh->prepare($sql);
  2771.    $cursor->execute;
  2772.    while ($username = $cursor->fetchrow) {
  2773.       print "    <OPTION>$usernamen";
  2774.    }
  2775.    $cursor->finish;
  2776.    print <<"EOF";
  2777.   </SELECT>
  2778.   <P>
  2779.   <INPUT TYPE="SUBMIT" NAME="tablerows" VALUE="Create user">
  2780. </FORM>
  2781. <P><HR WIDTH=90%><P>
  2782. <CENTER>
  2783. EOF
  2784.    text("</CENTER>Drop a user");
  2785.    print <<"EOF";
  2786. </CENTER>
  2787. <FORM METHOD=POST ACTION=$scriptname>
  2788.   <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  2789.   <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  2790.   <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="DBADMIN">
  2791.   <INPUT TYPE="HIDDEN" NAME="arg" VALUE="dropuser">
  2792.    Drop user
  2793.   <SELECT SIZE=1 NAME=username>
  2794. EOF
  2795.    $sql = "$copyright
  2796. SELECT
  2797.   USERNAME
  2798. FROM DBA_USERS
  2799.    ORDER BY USERNAME
  2800. ";
  2801.    $cursor = $dbh->prepare($sql);
  2802.    $cursor->execute;
  2803.    while ($username = $cursor->fetchrow) {
  2804.       print "    <OPTION>$usernamen";
  2805.    }
  2806.    $cursor->finish;
  2807.    print <<"EOF";
  2808.   </SELECT>
  2809.   &nbsp;&nbsp;cascade
  2810.   <INPUT TYPE=CHECKBOX NAME=cascade VALUE=cascade>
  2811.   <P>
  2812.   <INPUT TYPE="SUBMIT" NAME="dropuser" VALUE="Drop user">
  2813. </FORM>
  2814. EOF
  2815.    logit("Exit subroutine enterCreateUser");
  2816. }
  2817. sub noInfo {
  2818.    logit("Enter subroutine showInfo");
  2819.    message("There is no additional information to display");
  2820.    logit("Exit subroutine showInfo");
  2821. }
  2822. sub Director {
  2823.    logit("Enter subroutine Director");
  2824. # Put the if's here for reporting on the different types of objects.
  2825. # Show audit trail records for deletion.
  2826.    if ($object_type eq "VALIDATEINDEX") {validateIndex();}
  2827. # Show audit trail records for deletion.
  2828.    if ($object_type eq "AUDITLIST") {auditList();}
  2829. # Show rollbacks for administration.
  2830.    if ($object_type eq "RBSLIST") {rbsList();}
  2831. # Show Recovery Manager controlfile information.
  2832.    if ($object_type eq "RMANBACKUPS") {rmanBackups();}
  2833. # Show Recovery Manager catalog information.
  2834.    if ($object_type eq "RMANCATALOGQUERY") {rmanCatalogQuery();}
  2835. # Show audit trail records.
  2836.    if ($object_type eq "SHOWAUDITTRAIL") {showAuditTrail();}
  2837. # Choose auditing options.
  2838.    if ($object_type eq "ENTERAUDITS") {enterAudits();}
  2839. # Show a list of tables for a certain schema for reverse engineering.
  2840.    if ($object_type eq "SCHEMATABLEDDL") {schemaTableDDL();}
  2841. # Show a schemas invalid objects
  2842.    if ($object_type eq "SHOWINVALIDOBJECTS") {showInvalidObjects();}
  2843. # Show SQL in V$SQL for a user.
  2844.    if ($object_type eq "SQLAREALISTBYUSER") {sqlAreaListByUser();}
  2845. # Show list of users with SQL in V$SQL.
  2846.    if ($object_type eq "SQLAREALIST") {sqlAreaList();}
  2847. # Object administration.
  2848.    if ($object_type eq "OBJECTADMIN") {objectAdmin();}
  2849. # Rollback / transaction information
  2850.    if ($object_type eq "ROLLBACKMENU")                  {rollbackMenu();}
  2851. # StatsPack information menu.
  2852.    if ($object_type eq "STATSPACKMENU") {statsPackMenu();}
  2853. # StatsPack snapshot.
  2854.    if ($object_type eq "STATSPACKADMIN") {statsPackAdmin();}
  2855. # Backup (RMAN) information menu.
  2856.    if ($object_type eq "BACKUPMENU") {backupMenu();}
  2857. # Auditing administration menu.
  2858.    if ($object_type eq "PERFMENU") {perfMenu();}
  2859. # Auditing administration menu.
  2860.    if ($object_type eq "AUDITMENU") {auditMenu();}
  2861. # Session administration menu.
  2862.    if ($object_type eq "SESSIONMENU") {sessionMenu();}
  2863. # Preferences menu.
  2864.    if ($object_type eq "PREFMENU") {prefMenu();}
  2865. # Auditing administration.
  2866.    if ($object_type eq "AUDITADMIN") {auditAdmin();}
  2867. # Kill multiple sessions. Die die die!!! :)
  2868.    if ($object_type eq "SESSIONLIST") {sessionList();}
  2869. # Execute user administration commands
  2870.    if ($object_type eq "DBADMIN") {dbAdmin();}
  2871. # Create a user
  2872.    if ($object_type eq "ENTERCREATEUSER") {enterCreateUser();}
  2873. # Enter names of tables to reverse engineer
  2874.    if ($object_type eq "ENTERDDLTABLES") {enterDDLtables();}
  2875. # Report for a specific something
  2876.    if ($object_type eq "JAVA CLASS" || $object_type eq "JAVA RESOURCE")    {noInfo();}
  2877. # Display all themes for choosing.
  2878.    if ($object_type eq "SHOWTHEMES") {showThemes();}
  2879. # Display menu for choosing typical DBA type tasks.
  2880.    if ($object_type eq "TASKMENU")         {taskMenu();}
  2881. # Display tool properties.
  2882.    if ($object_type eq "SHOWPROPS")        {showProps();}
  2883. # Set a default theme that the user has chosen. Store in a cookie.
  2884. #   if ($object_type eq "SETTHEME")        {setTheme();}
  2885. # Report for a specific queue
  2886.    if ($object_type eq "QUEUE")            {showQueue();}
  2887. # Report for a specific operator
  2888.    if ($object_type eq "OPERATOR")    {showOperator();}
  2889. # Report for a specific library
  2890.    if ($object_type eq "LIBRARY")    {showLibrary();}
  2891. # Report for a specific cluster
  2892.    if ($object_type eq "CLUSTER")    {showCluster();}
  2893. # Report for a specific indextype
  2894.    if ($object_type eq "INDEXTYPE")    {showIndextype();}
  2895. # Report for a specific table.
  2896.    if ($object_type eq "TABLE")            {showTable();}
  2897. # Report for a specific table partition
  2898.    if ($object_type eq "TABLE PARTITION")  {showTablePart();}
  2899. # Report for a specific view.
  2900.    if ($object_type eq "VIEW")             {showView();}
  2901. # Report for a specific trigger.
  2902.    if ($object_type eq "TRIGGER")          {showTrigger();}
  2903. # Report for a specific database link.
  2904.    if ($object_type eq "DATABASE LINK")    {showDBlink();}
  2905. # Report for a specific function.
  2906.    if ($object_type eq "FUNCTION")         {showSource();}
  2907. # Report for a specific package body.
  2908.    if ($object_type eq "PACKAGE BODY")     {showSource();}
  2909. # Report for a specific package.
  2910.    if ($object_type eq "PACKAGE")          {showSource();}
  2911. # Report for a specific procedure.
  2912.    if ($object_type eq "PROCEDURE")        {showSource();}
  2913. # Report for a specific sequence.
  2914.    if ($object_type eq "SEQUENCE")         {showSequence();}
  2915. # Report for a specific index.
  2916.    if ($object_type eq "INDEX")            {showIndex();}
  2917. # Report for a specific index partition.
  2918.    if ($object_type eq "INDEX PARTITION")  {showIndexPart();}
  2919. # Report for a specific synonym.
  2920.    if ($object_type eq "SYNONYM")          {showSynonym();}
  2921. # Report on all privileges granted to a specific user.
  2922.    if ($object_type eq "GRANTSTO")         {showGrantsto();}
  2923. # Report on all privileges granted to a specific role.
  2924.    if ($object_type eq "ROLES")            {showRoles();}
  2925. # Report on all privileges granted from a specific user.
  2926.    if ($object_type eq "GRANTSFROM")       {showGrantsfrom();}
  2927. # This is what I call the "toplevel" page. Lists all users in database.
  2928.    if ($object_type eq "LISTUSERS")        {showUsers();}
  2929. # This is where you go after selecting a user. Lists general info,
  2930. # buttons for grants, and a list of object types owned by the user.
  2931.    if ($object_type eq "USERINFO")         {userInfo();}
  2932. # This will bring back a table of objects that are of the type that
  2933. # the user clicked on.
  2934.    if ($object_type eq "LISTOBJECTS")      {showObjects();}
  2935. # List all of the tablespaces in the database.
  2936.    if ($object_type eq "TABLESPACES")      {showTablespaces();}
  2937. # Report on information about a specific tablespace.
  2938.    if ($object_type eq "TSINFO")           {showTSinfo();}
  2939. # Show a clickable list of all datafiles in the database
  2940.    if ($object_type eq "DATAFILES")        {showDBfiles();}
  2941. # Show information abaout a particular datafile
  2942.    if ($object_type eq "DATAFILE")         {showFile();}
  2943. # Show all instance parameters from V$PARAMETER in a table
  2944.    if ($object_type eq "PARAMETERS")       {showParameters();}
  2945. # Show information about redologs, including a graph
  2946.    if ($object_type eq "REDOLOGS")         {showRedo();}
  2947. # Show information about all sessions in the instance, or
  2948. # for a particular user, if $user is set
  2949.    if ($object_type eq "SESSIONS")         {showSessions($user);}
  2950. # Show instance session summary with refresh, sortable.
  2951.    if ($object_type eq "TOPSESSIONS")      {topSessions();}
  2952. # Display "n" rows 
  2953.    if ($object_type eq "TABLEROWS")        {showRows("$rowdisplay");}
  2954. # Display information about a constraint
  2955.    if ($object_type eq "CONSTRAINT")       {showConstraint();}
  2956. # Show a clickable list of all rollback segments in the database
  2957.    if ($object_type eq "SHOWROLLBACKS")     {showRollbacks();}
  2958. # Show a list of all active / rolling back transactions in the database
  2959.    if ($object_type eq "SHOWTRANSACTIONS")  {showTransactions();}
  2960. # Show information about a particular rollback segment
  2961.    if ($object_type eq "ROLLBACK")         {showRollback();}
  2962. # Check the instance for contending and non-contending locks
  2963.    if ($object_type eq "CONTENTION")       {showContention();}
  2964. # Show a table graph of datafiles with allocation
  2965.    if ($object_type eq "FILEGRAPH")        {showFilegraph();}
  2966. # Show a table graph of tablespaces with allocation
  2967.    if ($object_type eq "TSGRAPH")          {showTSgraph();}
  2968. # Show statistics for a particular file
  2969.    if ($object_type eq "TSFILEGRAPH")      {showTSfilegraph();}
  2970. # Show statistics for a selected session
  2971.    if ($object_type eq "SESSIONSTATS")     {showSessionstats();}
  2972. # Break down a user's object usage by object type and tablespace
  2973.    if ($object_type eq "OBJECTREPORT")     {objectReport();}
  2974. # Report of space usage by user
  2975.    if ($object_type eq "USERSPACEREPORT")     {userSpaceReport();}
  2976. # Report of space usage by tablespace / user
  2977.    if ($object_type eq "TSSPACEREPORT")     {tsSpaceReport();}
  2978. # Report of datafile fragmentation
  2979.    if ($object_type eq "FILEFRAGREPORT")   {fileFragReport();}
  2980. # Enter number of extents for extent report
  2981.    if ($object_type eq "ENTEREXTENTREPORT")   {enterExtentReport();}
  2982. # Run an extent report
  2983.    if ($object_type eq "EXTENTREPORT")        {extentReport();}
  2984. # Show OPS related information
  2985.    if ($object_type eq "OPSPAGE")          {OPSpage();}
  2986. # Search for objects by object name or object ID
  2987.    if ($object_type eq "OBJECTSEARCH")     {objectSearch();}
  2988. # Show the privileges granted to users for a particular object
  2989.    if ($object_type eq "OBJECTGRANTS")     {showObjectGrants();}
  2990. # Show memory and performance related data
  2991.    if ($object_type eq "PERFORMANCE")      {showPerformance();}
  2992. # Bring up a screen for the user to enter a new username and
  2993. # password in order to run an explain plan as that user.
  2994.    if ($object_type eq "EXPLAIN")          {enterUserExplainPlan();}
  2995. # Bring up the explain plan screen
  2996.    if ($object_type eq "EXPLAINSCREEN")    {explainScreen();}
  2997. # Bring up a box for a user to run SQL in an explain plan as a
  2998. # user other than the user logged in to Oracletool. This is 
  2999. # executed from the session information screens.
  3000.    if ($object_type eq "EXPLAINPLAN")      {enterExplainPlan();}
  3001. # Run the explain plan
  3002.    if ($object_type eq "RUNEXPLAINPLAN")   {runExplainPlan();}
  3003. # SQL-Worksheet
  3004.    if ($object_type eq "WORKSHEET")        {enterWorksheet();}
  3005. # Run the SQL entered on the worksheet
  3006.    if ($object_type eq "RUNSQL") {runSQL();}
  3007. # Show settings for a profile
  3008.    if ($object_type eq "PROFILE")          {showProfile();}
  3009. # Show roles, profiles, and users with the DBA role
  3010.    if ($object_type eq "SECURITY")         {showSecurity();}
  3011. # Show auditing information
  3012.    if ($object_type eq "AUDITING")         {showAllAuditing();}
  3013. # Show archiving information
  3014.    if ($object_type eq "ARCHIVING")        {showArchiving();}
  3015. # Show controlfile information
  3016.    if ($object_type eq "CONTROLFILES")     {showControlfiles();}
  3017. # Show Replication information (Master)
  3018.    if ($object_type eq "REPMASTER")        {showRepmaster();}
  3019. # Show advanced replication groups 
  3020.    if ($object_type eq "ADVREP")           {showAdvRepGroups();}
  3021. # Show group information, advanced replication
  3022.    if ($object_type eq "ADVREPGROUP")      {showAdvRepGroup();}
  3023. # Show Refresh groups
  3024.    if ($object_type eq "REFRESHGROUPS")    {showRefreshgroups();}
  3025. # Show Refresh group children.
  3026.    if ($object_type eq "REFRESHINFO")      {showRefreshinfo();}
  3027. # Show info for a particular snapshot 
  3028.    if ($object_type eq "SNAPINFO")         {showSnapinfo();}
  3029. # Generate all DDL to recreate a tablespace
  3030.    if ($object_type eq "TSDDL")            {tsDDL();}
  3031. # Generate all DDL to recreate a rollback segment
  3032.    if ($object_type eq "RBSDDL")            {rbsDDL();}
  3033. # Generate all DDL to recreate a table and its dependencies
  3034.    if ($object_type eq "TABLEDDL")         {tableDDL();}
  3035. # Generate all DDL to recreate a user and its dependencies
  3036.    if ($object_type eq "USERDDL")          {userDDL();}
  3037. # Show a fragmentation map of a datafile or tablespace
  3038.    if ($object_type eq "FRAGMAP")          {fragMap();}
  3039. # Show a fragmentation map of an object
  3040.    if ($object_type eq "OBJECTFRAGMAP")    {objectFragMap();}
  3041. # Kill a session
  3042.    if ($object_type eq "KILLSESSION")      {killSession();}
  3043. # Show a fragmentation map of a datafile
  3044.    if ($object_type eq "DBFILE_BLOCK")     {dbfileBlock();}
  3045. # Show some info about things that have recently changed in the database.
  3046.    if ($object_type eq "RECENTEVENTS")      {recentEvents();}
  3047.    logit("Exit subroutine Director");
  3048. }