Version: 0.1
Type: Full Script
Category: Databases
License: GNU General Public License
Description: displays a diagram of a postgres db and list of tables and sequences. A good quick a dirty view of a DB from a web page.
<?
//------------------------------------------------------------------
//created by mike wolf(init): wolf@geekpunk.org
//
//description:
//used to display a db diagram and table/sequence list
//for a postgres DB. You can either specifiy the main
//vars below or pass them along in the url
//
//V1V4 L4 0P3N 50URC3
//
//------------------------------------------------------------------
//-----------------------------------------------------------------
//chage these variables as needed
//-----------------------------------------------------------------
$db="dbname";
$server="servername";
$pass="dbpassword";
$user="username";
//-----------------------------------------------------------------
//change below at your own risk....
//-----------------------------------------------------------------
function tabledisplay($SQL,$DBSERVER,$DB,$USERNAME,$PASSWORD)
{
// make a connection and get a result
$connection = pg_connect("host=$DBSERVER dbname=$DB user=$USERNAME password=$PASSWORD") or die("couldnt make a connection to DB");
// lets get the details for looping
$sql_result=pg_exec($connection,$SQL) or die("query has errors in it");
$num = pg_numrows($sql_result);
$GLOBALS["rowcount"] = pg_numrows($sql_result);
$fieldnum = pg_numfields($sql_result);
//lets get those field names and populate the array
for($i=0;$i<$fieldnum; $i++)
{
$fieldname[]=pg_fieldname($sql_result,$i);
$fieldname2[pg_fieldname($sql_result,$i)][]="";
while($x<$num)
{
$row=pg_fetch_array($sql_result,$x);
$fieldname2[pg_fieldname($sql_result,$i)][$x].=$row[pg_fieldname($sql_result,$i)];
$x++;
}
$x=0;
}
//set a gloabl var to the tables
for($i=0;$i<$num;$i++)
{
$GLOBALS["tables"].= $fieldname2["Name"][$i] . "<br>";
}
//pull out the table details
for($X=1;$X<$num;$X++)
{
$table = $fieldname2["Name"][$X];
if(strrpos($table,"_seq")== false)
{
$GLOBALS["fieldrow"].="<table border=1>";
$sqlstate = "select * from $table";
pg_freeresult($sql_result);
$sql_result=pg_exec($connection,$sqlstate) or die("query has errors in it");
$GLOBALS["fieldrow"].="<tr style=\"background-color:CCCCCC;\"><td colspan=3>$table</td></tr>";
for($Y=0;$Y<pg_numfields($sql_result);$Y++)
{
$fieldname=pg_fieldname($sql_result,$Y);
$fieldtype=pg_fieldtype($sql_result,$Y);
$fieldsize=pg_fieldsize($sql_result,$Y);
$GLOBALS["fieldrow"].="<tr><td>$fieldname</td><td>$fieldtype</td><td>$fieldsize</td></tr>";
}
$GLOBALS["fieldrow"].="</table>\n<br>";
}
}
//free up some memory
pg_freeresult($sql_result);
pg_close($connection);
}
//big old sql statement that does a \d on the db
$sql="SELECT c.relname as \"Name\", 'table'::text as \"Type\", u.usename as \"Owner\"" ;
$sql.="FROM pg_class c, pg_user u" ;
$sql.=" WHERE c.relowner = u.usesysid AND c.relkind = 'r'" ;
$sql.=" AND c.relname !~ '^pg_'" ;
$sql.=" UNION SELECT c.relname as \"Name\", 'table'::text as \"Type\", NULL as \"Owner\" FROM pg_class c " ;
$sql.="WHERE c.relkind = 'r' AND not exists (select 1 from pg_user where usesysid = c.relowner) " ;
$sql.="AND c.relname !~ '^pg_' UNION SELECT c.relname as \"Name\", 'view'::text as \"Type\", u.usename as \"Owner\"" ;
$sql.="FROM pg_class c, pg_user u WHERE c.relowner = u.usesysid AND c.relkind = 'v'" ;
$sql.=" AND c.relname !~ '^pg_'" ;
$sql.=" UNION" ;
$sql.=" SELECT c.relname as \"Name\", 'view'::text as \"Type\", NULL as \"Owner\"" ;
$sql.="FROM pg_class c";
$sql.=" WHERE c.relkind = 'v'" ;
$sql.=" AND not exists (select 1 from pg_user where usesysid = c.relowner)" ;
$sql.=" AND c.relname !~ '^pg_'";
$sql.=" UNION ";
$sql.="SELECT c.relname as \"Name\", " ;
$sql.=" (CASE WHEN relkind = 'S' THEN 'sequence'::text ELSE 'index'::text END) as \"Type\", u.usename as \"Owner\"";
$sql.="FROM pg_class c, pg_user u ";
$sql.="WHERE c.relowner = u.usesysid AND relkind in ('S')" ;
$sql.=" AND c.relname !~ '^pg_'";
$sql.=" UNION ";
$sql.="SELECT c.relname as \"Name\"," ;
$sql.=" (CASE WHEN relkind = 'S' THEN 'sequence'::text ELSE 'index'::text END) as \"Type\", NULL as \"Owner\"" ;
$sql.="FROM pg_class c WHERE not exists (select 1 from pg_user where usesysid = c.relowner) AND relkind ";
$sql.=" in ('S') AND c.relname !~ '^pg_'";
//call the function which will set some global variables use @ to suppress error
@tabledisplay($sql,$server,$db,$user,$pass);
?>
<!--- display them -->
TABLE/SEQUENCE NAMES
<hr>
<?
echo $GLOBALS["tables"];
?>
<hr>
TABLES
<hr>
<?
echo $GLOBALS["fieldrow"];
?>