Advertisement
planzelle

PHP script to display Postgres DB's and schemata

Jan 19th, 2016
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.49 KB | None | 0 0
  1. <?php
  2. /**
  3.  * Live Overview Databases and Schemata for Postgresql
  4.  *
  5.  * Shows all registered databases and if applicable their schemes
  6.  * @author: planzelle
  7.  *
  8.  */
  9.  
  10. // init (hosts to display)
  11. $hosts = array('f1-db1.sys.de', 'f1-db2.sys.de');
  12.  
  13. // NO CHANGES BEYOND THIS POINT ! (user: postgres, no password)
  14.  
  15. // get handle for postgres internal system db
  16. function getPgHandle($host) {
  17.     $dsn = sprintf("pgsql: host=%s dbname=postgres", $host);
  18.     $dbh = new PDO($dsn, 'postgres', '') or die('No connection to host: '.$host);
  19.     return $dbh;
  20. }
  21.  
  22.  
  23. // get handle for db
  24. function getDbHandle($host, $dbname) {
  25.     $dsn = sprintf("pgsql: host=%s dbname=%s", $host, $dbname);
  26.     $dbh = new PDO($dsn, 'postgres', '') or die('No connection to host: '.$host);
  27.     return $dbh;
  28. }
  29.  
  30.  
  31. // filter only non-system dbs and those who are not test/demo or templ
  32. function filterDatname($name) {
  33.     $ret = strpos($name, 'etacs_')===0? true : false;
  34.     if (preg_match('/(test|demo|_templ)/',$name)) {
  35.         $ret = false;
  36.     }
  37.     return $ret;
  38. }
  39.  
  40. // filte allowed schema
  41. function filterSchema($name) {
  42.     $ret = true;
  43.     if (preg_match('/(public|information_schema|pg_)/', $name)) {
  44.         $ret = false;
  45.     }
  46.     return $ret;
  47. }
  48.  
  49.  
  50. function printHeader() {
  51.     echo <<<EOH
  52. <!DOCTYPE html>
  53. <html>
  54. <head>
  55.     <meta charset="utf-8" />
  56.     <title>Etacs DB Explorer</title>
  57.     <style>
  58.         .grey { color: grey;}
  59.         .blue { color: blue;}
  60.         .red { color: red;}
  61.         body { font-family: courier;}
  62.         td { padding: 5px;}
  63.     </style>
  64. </head>
  65. <body>
  66.  
  67. EOH;
  68. }
  69.  
  70.  
  71.  
  72. function printContent($arr) {
  73.     $cnt = 0;
  74.     printf('<table><tbody><tr valign="top">%s',"\n");
  75.     foreach($arr as $server) {
  76.         $host = $server['name'];
  77.         printf('<td><table border="1"><tr><th><h4 class="blue">%s</h4></th></tr>%s', $host, "\n");
  78.         foreach ($server['databases'] as $databases) {
  79.             $database = $databases['name'];
  80.             if (empty($arr[$host]['databases'][$database]['schema'])) {
  81.                 // no schemas, so print and count the database
  82.                 printf("<tr><td>%s. %s</td></tr>\n", ++$cnt, $database);
  83.             } else {
  84.                 // schema dbs, so print, but don't count databases and list schemata
  85.                 printf('<tr><td><em><strong class="grey">Schema-DB:</strong> <span class="red">%s</span></em><br />%s', $database, "\n");
  86.                 foreach($arr[$host]['databases'][$database]['schema'] as $schema) {
  87.                     printf("%s. %s<br />\n", ++$cnt, $schema);
  88.                 }
  89.                 print("</td></tr>\n");
  90.             }
  91.         }
  92.         echo "</table></td>";
  93.     }
  94.     echo "</tr></tbody></table>\n";
  95. }
  96.  
  97.  
  98.  
  99. function printFooter() {
  100.     echo <<<EOF
  101.  
  102. </body>
  103. </html>
  104. EOF;
  105. }
  106.  
  107.  
  108. $arr = array();
  109. printHeader();
  110. // main loop
  111. foreach($hosts as $host) {
  112.     $arr[$host] = array('name'=>$host, 'databases'=>array());
  113.     $db1 = getPgHandle($host);
  114.     $sql1 = "SELECT datname FROM pg_database ORDER BY datname;";
  115.     $stmt1 = $db1->query($sql1);
  116.     if ($stmt1) {
  117.         while($row = $stmt1->fetch(PDO::FETCH_ASSOC)) {
  118.             $dbname = $row['datname'];
  119.             if (filterDatname($dbname)) {
  120.                 $arr[$host]['databases'][$dbname] = array('name'=>$dbname, 'schema'=>array());
  121.                 $db2 = getDbHandle($host, $dbname);
  122.                 $sql2 = sprintf("SELECT schema_name FROM information_schema.schemata WHERE catalog_name='%s' ORDER BY schema_name;", $dbname);
  123.                 $stmt2 = $db2->query($sql2);
  124.                 if ($stmt2) {
  125.                     while($row2 = $stmt2->fetch(PDO::FETCH_ASSOC)) {
  126.                         $schema = $row2['schema_name'];
  127.                         //echo $schema;
  128.                         if (filterSchema($schema)) {
  129.                             $arr[$host]['databases'][$dbname]['schema'][] = $schema;
  130.                         }
  131.                     }
  132.                 }
  133.             }
  134.         }
  135.     }
  136. }
  137. printContent($arr);
  138. printFooter();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement