initial schema support. backwards compatible with non-schema databases. still has...
authorchriskl <chriskl>
Thu, 11 Jul 2002 06:02:57 +0000 (06:02 +0000)
committerchriskl <chriskl>
Thu, 11 Jul 2002 06:02:57 +0000 (06:02 +0000)
classes/database/Postgres71.php
classes/database/Postgres73.php [new file with mode: 0644]
public_html/browser.php

index c35fbe3c3cc5e20b834a68ca760cc502295bf09e..1ccd99b8cea14008b1e9cfe75ce5073774957810 100644 (file)
@@ -4,7 +4,7 @@
  * A class that implements the DB interface for Postgres\r
  * Note: This class uses ADODB and returns RecordSets.\r
  *\r
- * $Id: Postgres71.php,v 1.8 2002/05/01 09:37:30 chriskl Exp $\r
+ * $Id: Postgres71.php,v 1.9 2002/07/11 06:02:57 chriskl Exp $\r
  */\r
 \r
 // @@@ THOUGHT: What about inherits? ie. use of ONLY???\r
@@ -656,6 +656,7 @@ class Postgres71 extends BaseDB {
        function hasTypes() { return true; }\r
        function hasAggregates() { return true; }\r
        function hasRules() { return true; }\r
+       function hasSchemas() { return false; }\r
 \r
 }\r
 \r
diff --git a/classes/database/Postgres73.php b/classes/database/Postgres73.php
new file mode 100644 (file)
index 0000000..541b87b
--- /dev/null
@@ -0,0 +1,193 @@
+<?php\r
+\r
+/**\r
+ * A class that implements the DB interface for Postgres\r
+ * Note: This class uses ADODB and returns RecordSets.\r
+ *\r
+ * $Id: Postgres73.php,v 1.1 2002/07/11 06:02:57 chriskl Exp $\r
+ */\r
+\r
+// @@@ THOUGHT: What about inherits? ie. use of ONLY???\r
+\r
+include_once('../classes/database/Postgres71.php');\r
+\r
+class Postgres73 extends Postgres71 {\r
+\r
+       var $nspFields = array('nspname' => 'nspname', 'nspowner' => 'nspowner');\r
+\r
+       // Store the current schema\r
+       var $_schema = 'public';\r
+\r
+       // @@ Should we bother querying for this?\r
+       var $_lastSystemOID = 16568;\r
+\r
+       function Postgres73($host, $port, $database, $user, $password) {\r
+               $this->Postgres71($host, $port, $database, $user, $password);\r
+       }\r
+\r
+       // Schema functions\r
+       \r
+       /**\r
+        * Sets the current schema search path\r
+        * @param $path An array of schemas in required search order\r
+        * @return 0 success\r
+        * @return -1 Array not passed\r
+        * @return -2 Array must contain at least one item\r
+        */\r
+       function setSearchPath($paths) {\r
+               if (!is_array($paths)) return -1;\r
+               elseif (sizeof($paths) == 0) return -2;\r
+               $this->arrayClean($paths);\r
+               \r
+               $sql = 'SET SEARCH_PATH="' . implode('"', $paths) . '"';\r
+               \r
+               return $this->execute($sql);\r
+       }       \r
+       \r
+       /**\r
+        * Return all schemas in the current database\r
+        * @return All schemas, sorted alphabetically - but with PUBLIC first (if it exists)\r
+        */\r
+       function &getSchemas() {\r
+               if (!$this->_showSystem) $and = "AND nspname NOT LIKE 'pg_%' ";\r
+               else $and = '';\r
+               $sql = "SELECT nspname, nspowner FROM pg_namespace WHERE nspname = 'public'\r
+                                       UNION ALL\r
+                                 SELECT nspname, nspowner FROM pg_namespace WHERE nspname != 'public' {$and}ORDER BY nspname";\r
+                                 \r
+               return $this->selectSet($sql);\r
+       }\r
+       \r
+       /**\r
+        * Return all information relating to a schema\r
+        * @param $schema The name of the schema\r
+        * @return Schema information\r
+        */\r
+       function &getSchemaByName($schema) {\r
+               $this->clean($schema);\r
+               $sql = "SELECT * FROM pg_namespace WHERE nspname='{$schema}'";\r
+               return $this->selectRow($sql);\r
+       }\r
+\r
+       /**\r
+        * Creates a new schema.\r
+        * @param $schemaname The name of the schema to create\r
+        * @param $authorization (optional) The username to create the schema for.\r
+        * @param $authorization (optional) If omitted, defaults to current user.\r
+        * @return 0 success\r
+        */\r
+       function createSchema($schemaname, $authorization = '') {\r
+               $this->clean($schemaname);\r
+               $this->clean($authorization);\r
+               \r
+               $sql = "CREATE SCHEMA \"{$schemaname}\"";\r
+               if ($authorization != '') $sql .= " AUTHORIZATION \"{$authorization}\"";\r
+               \r
+               return $this->execute($sql);\r
+       }\r
+       \r
+       /**\r
+        * Drops a schema.\r
+        * @param $schemaname The name of the schema to drop\r
+        * @return 0 success\r
+        */\r
+       function dropSchema($schemaname) {\r
+               $this->clean($schemaname);\r
+               \r
+               $sql = "DROP SCHEMA \"{$schemaname}\"";\r
+               \r
+               return $this->execute($sql);\r
+       }\r
+\r
+       // Table functions\r
+\r
+       /**\r
+        * Return all tables in current database\r
+        * @return All tables, sorted alphabetically \r
+        */\r
+       function &getTables() {\r
+               $sql = "SELECT tablename, tableowner FROM pg_tables ORDER BY tablename";\r
+               return $this->selectSet($sql);\r
+       }\r
+\r
+       /**\r
+        * Return all information relating to a table\r
+        * @param $table The name of the table\r
+        * @return Table information\r
+        */\r
+       function &getTableByName($table) {\r
+               $this->clean($table);\r
+               $sql = "SELECT * FROM pg_class WHERE relname='{$table}'";\r
+               return $this->selectRow($sql);\r
+       }\r
+\r
+       /**\r
+        * Sets whether or not a column can contain NULLs\r
+        * @param $table The table that contains the column\r
+        * @param $column The column to alter\r
+        * @param $state True to set null, false to set not null\r
+        * @return 0 success\r
+        * @return -1 attempt to set not null, but column contains nulls\r
+        * @return -2 transaction error\r
+        * @return -3 lock error\r
+        * @return -4 update error\r
+        */\r
+       function setColumnNull($table, $column, $state) {\r
+               $this->clean($table);\r
+               $this->clean($column);\r
+\r
+               $sql = "ALTER TABLE \"{$table}\" ALTER COLUMN \"{$column}\" " . (($state) ? 'DROP' : 'SET') . " NOT NULL";\r
+\r
+               return $this->execute($sql);\r
+       }\r
+\r
+       // View functions\r
+       \r
+       /**\r
+        * Returns a list of all views in the database\r
+        * @return All views\r
+        */\r
+       function getViews() {\r
+               if (!$this->_showSystem)\r
+                       $where = "WHERE viewname NOT LIKE 'pg_%'";\r
+               else $where  = '';\r
+               \r
+               $sql = "SELECT viewname, viewowner FROM pg_views {$where} ORDER BY viewname";\r
+\r
+               return $this->selectSet($sql);\r
+       }\r
+\r
+       // Operator functions\r
+       \r
+       /**\r
+        * Returns a list of all operators in the database\r
+        * @return All operators\r
+        */\r
+       function getOperators() {\r
+               if (!$this->_showSystem)\r
+                       $where = "WHERE po.oid > '{$this->_lastSystemOID}'::oid";\r
+               else $where  = '';\r
+               \r
+               $sql = "\r
+                       SELECT\r
+            po.oid,\r
+                               po.oprname,\r
+                               (SELECT typname FROM pg_type pt WHERE pt.oid=po.oprleft) AS oprleftname,\r
+                               (SELECT typname FROM pg_type pt WHERE pt.oid=po.oprright) AS oprrightname,\r
+                               (SELECT typname FROM pg_type pt WHERE pt.oid=po.oprresult) AS resultname\r
+                       FROM\r
+                               pg_operator po\r
+                       {$where}                                \r
+                       ORDER BY\r
+                               po.oprname, po.oid\r
+               ";\r
+\r
+               return $this->selectSet($sql);\r
+       }\r
+        \r
+       // Capabilities\r
+       function hasSchemas() { return true; }\r
+\r
+}\r
+\r
+?>
\ No newline at end of file
index db50f970375ea18625392ad217f6be239e55fbc4..ba402552799ee536a43898e65c0ac8f8e7e6a115 100644 (file)
@@ -3,7 +3,7 @@
        /**\r
         * Main object browser\r
         *\r
-        * $Id: browser.php,v 1.6 2002/05/15 09:57:55 chriskl Exp $\r
+        * $Id: browser.php,v 1.7 2002/07/11 06:02:57 chriskl Exp $\r
         */\r
 \r
        // Include application functions\r
        while (!$databases->EOF) {\r
                $node = $tree->add_folder($root, htmlspecialchars($databases->f[$data->dbFields['dbname']]), \r
                        'database.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]));\r
-               if ($data->hasTables())\r
-                       $tree->add_document($node, $strTables, 'tables.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]), "../images/themes/{$guiTheme}/tables.gif");\r
-               if ($data->hasViews())\r
-                       $tree->add_document($node, $strViews, 'views.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]), "../images/themes/{$guiTheme}/views.gif");\r
-/*             if ($data->hasTriggers())\r
-                       $tree->add_document($node, $strTriggers, 'triggers.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]));\r
-               if ($data->hasRules())\r
-                       $tree->add_document($node, $strRules, 'rules.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]));*/\r
-               if ($data->hasSequences())\r
-                       $tree->add_document($node, $strSequences, 'sequences.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]), "../images/themes/{$guiTheme}/sequences.gif");\r
-               if ($data->hasFunctions())\r
-                       $tree->add_document($node, $strFunctions, 'functions.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]), "../images/themes/{$guiTheme}/functions.gif");\r
-               if ($data->hasOperators())\r
-                       $tree->add_document($node, $strOperators, 'operators.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]));\r
-               if ($data->hasTypes())\r
-                       $tree->add_document($node, $strTypes, 'types.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]));\r
-               if ($data->hasAggregates())\r
-                       $tree->add_document($node, $strAggregates, 'aggregates.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]));\r
+               if ($data->hasSchemas()) {\r
+                       $schemas = &$data->getSchemas();\r
+                       while (!$schemas->EOF) {\r
+                               $schemanode = $tree->add_folder($node, htmlspecialchars($schemas->f[$data->nspFields['nspname']]), \r
+                                       'schema.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]) . '&schema=' . \r
+                                       urlencode($schemas->f[$data->nspFields['nspname']]));                   \r
+                               if ($data->hasTables())\r
+                                       $tree->add_document($schemanode, $strTables, 'tables.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]), "../images/themes/{$guiTheme}/tables.gif");\r
+                               if ($data->hasViews())\r
+                                       $tree->add_document($schemanode, $strViews, 'views.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]), "../images/themes/{$guiTheme}/views.gif");\r
+               /*              if ($data->hasTriggers())\r
+                                       $tree->add_document($node, $strTriggers, 'triggers.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]));\r
+                               if ($data->hasRules())\r
+                                       $tree->add_document($node, $strRules, 'rules.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]));*/\r
+                               if ($data->hasSequences())\r
+                                       $tree->add_document($schemanode, $strSequences, 'sequences.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]), "../images/themes/{$guiTheme}/sequences.gif");\r
+                               if ($data->hasFunctions())\r
+                                       $tree->add_document($schemanode, $strFunctions, 'functions.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]), "../images/themes/{$guiTheme}/functions.gif");\r
+                               if ($data->hasOperators())\r
+                                       $tree->add_document($schemanode, $strOperators, 'operators.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]));\r
+                               if ($data->hasTypes())\r
+                                       $tree->add_document($schemanode, $strTypes, 'types.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]));\r
+                               if ($data->hasAggregates())\r
+                                       $tree->add_document($schemanode, $strAggregates, 'aggregates.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]));\r
+                               $schemas->moveNext();\r
+                       }\r
+               }\r
+               // Database doesn't support schemas\r
+               else {\r
+                       if ($data->hasTables())\r
+                               $tree->add_document($node, $strTables, 'tables.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]), "../images/themes/{$guiTheme}/tables.gif");\r
+                       if ($data->hasViews())\r
+                               $tree->add_document($node, $strViews, 'views.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]), "../images/themes/{$guiTheme}/views.gif");\r
+       /*              if ($data->hasTriggers())\r
+                               $tree->add_document($node, $strTriggers, 'triggers.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]));\r
+                       if ($data->hasRules())\r
+                               $tree->add_document($node, $strRules, 'rules.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]));*/\r
+                       if ($data->hasSequences())\r
+                               $tree->add_document($node, $strSequences, 'sequences.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]), "../images/themes/{$guiTheme}/sequences.gif");\r
+                       if ($data->hasFunctions())\r
+                               $tree->add_document($node, $strFunctions, 'functions.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]), "../images/themes/{$guiTheme}/functions.gif");\r
+                       if ($data->hasOperators())\r
+                               $tree->add_document($node, $strOperators, 'operators.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]));\r
+                       if ($data->hasTypes())\r
+                               $tree->add_document($node, $strTypes, 'types.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]));\r
+                       if ($data->hasAggregates())\r
+                               $tree->add_document($node, $strAggregates, 'aggregates.php?database=' . urlencode($databases->f[$data->dbFields['dbname']]));\r
+               }\r
                $databases->moveNext();\r
        }\r
        \r