phase 1 of complete domain support. properties and alter domain still to be done...
authorchriskl <chriskl>
Tue, 29 Jul 2003 09:07:09 +0000 (09:07 +0000)
committerchriskl <chriskl>
Tue, 29 Jul 2003 09:07:09 +0000 (09:07 +0000)
HISTORY
browser.php
classes/database/BaseDB.php
classes/database/Postgres73.php
classes/database/Postgres74.php
lang/english.php
lang/recoded/english.php

diff --git a/HISTORY b/HISTORY
index 3931b0b44b83d271e318e7c7b13d27cdf2acd281..1effc07e8dfda3a171e3a13bd071e3114692a3b3 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -11,6 +11,7 @@ Version 3.1
 * Allow granting privileges WITH GRANT OPTION for 7.4
 * Display new PostgreSQL 7.4 grant options and grantor in privileges
 * Find Object feature
+* Support for domains in 7.3 and domain constraints in 7.4
 
 Version 3.0
 -----------
index 9c2dafc037dbfb5f323b50e95f5452bda2681374..fe329bdaf357a6a97f089f4beace390234cacc63 100644 (file)
@@ -5,7 +5,7 @@
         * if you click on a database it shows a list of database objects in that
         * database.
         *
-        * $Id: browser.php,v 1.13 2003/06/22 09:43:21 chriskl Exp $
+        * $Id: browser.php,v 1.14 2003/07/29 09:07:09 chriskl Exp $
         */
 
        // Include application functions
                        // Add folder to schema
                        $schemanode->addItem($func_node);
                }
+               // Domains
+               if ($data->hasDomains()) {
+                       $dom_node = &new HTML_TreeNode(array(
+                                                       'text' => addslashes($lang['strdomains']), 
+                                                       'link' => addslashes(htmlspecialchars("domains.php?{$querystr}")), 
+                                                       'icon' => "../../../images/themes/{$conf['theme']}/types.gif", 
+                                                       'expandedIcon' => "../../../images/themes/{$conf['theme']}/types.gif",
+                                                       'expanded' => false,
+                                                       'linkTarget' => 'detail'));
+
+                       // Add folder to schema
+                       $schemanode->addItem($dom_node);
+               }
                // Types
                if ($data->hasTypes()) {
-                       $func_node = &new HTML_TreeNode(array(
+                       $type_node = &new HTML_TreeNode(array(
                                                        'text' => addslashes($lang['strtypes']), 
                                                        'link' => addslashes(htmlspecialchars("types.php?{$querystr}")), 
                                                        'icon' => "../../../images/themes/{$conf['theme']}/types.gif", 
                                                        'linkTarget' => 'detail'));
 
                        // Add folder to schema
-                       $schemanode->addItem($func_node);
+                       $schemanode->addItem($type_node);
                }
        }       
 
index d9794aef78158a77a2644856c98e532cb24b74df..9a779c30c44cb25695a7b68166fcc790f285bbe0 100644 (file)
@@ -4,7 +4,7 @@
  * A class that implements the DB interface for Postgres
  * Note: This class uses ADODB and returns RecordSets.
  *
- * $Id: BaseDB.php,v 1.19 2003/05/31 06:56:02 chriskl Exp $
+ * $Id: BaseDB.php,v 1.20 2003/07/29 09:07:09 chriskl Exp $
  */
 
 include_once('classes/database/ADODB_base.php');
@@ -197,6 +197,8 @@ class BaseDB extends ADODB_base {
        function hasCluster() { return false; }
        function hasDropBehavior() { return false; }
        function hasSRFs() { return false; }
+       function hasDomains() { return false; }
+       function hasDomainConstraints() { return false; }
 
 }
 
index f449ef5b4541874bbf1e7517e3af5eaeb2b2c6a5..ab0979a9ba2e18ff8167fcfe1b0f39490ae9fedd 100644 (file)
@@ -4,7 +4,7 @@
  * A class that implements the DB interface for Postgres
  * Note: This class uses ADODB and returns RecordSets.
  *
- * $Id: Postgres73.php,v 1.50 2003/07/29 00:36:45 chriskl Exp $
+ * $Id: Postgres73.php,v 1.51 2003/07/29 09:07:09 chriskl Exp $
  */
 
 // @@@ THOUGHT: What about inherits? ie. use of ONLY???
@@ -102,7 +102,7 @@ class Postgres73 extends Postgres72 {
                
                if (!$conf['show_system']) $and = "AND nspname NOT LIKE 'pg_%'";
                else $and = '';
-               $sql = "SELECT pn.nspname, pu.usename AS nspowner FROM pg_namespace pn, pg_user pu
+               $sql = "SELECT pn.nspname, pu.usename AS nspowner FROM pg_catalog.pg_namespace pn, pg_catalog.pg_user pu
                        WHERE pn.nspowner = pu.usesysid
                        {$and}ORDER BY nspname";
 
@@ -116,7 +116,7 @@ class Postgres73 extends Postgres72 {
         */
        function &getSchemaByName($schema) {
                $this->clean($schema);
-               $sql = "SELECT * FROM pg_namespace WHERE nspname='{$schema}'";
+               $sql = "SELECT * FROM pg_catalog.pg_namespace WHERE nspname='{$schema}'";
                return $this->selectRow($sql);
        }
 
@@ -159,7 +159,7 @@ class Postgres73 extends Postgres72 {
         * @return All conversions, sorted alphabetically
         */
        function &getConversions() {
-               $sql = "SELECT conname, conowner FROM pg_conversion ORDER BY conname";
+               $sql = "SELECT conname, conowner FROM pg_catalog.pg_conversion ORDER BY conname";
                                  
                return $this->selectSet($sql);
        }
@@ -171,7 +171,7 @@ class Postgres73 extends Postgres72 {
         */
        function &getConversionByName($conversion) {
                $this->clean($conversion);
-               $sql = "SELECT * FROM pg_conversion WHERE conname='{$conversion}'";
+               $sql = "SELECT * FROM pg_catalog.pg_conversion WHERE conname='{$conversion}'";
                return $this->selectRow($sql);
        }
 
@@ -186,8 +186,8 @@ class Postgres73 extends Postgres72 {
        function hasObjectID($table) {
                $this->clean($table);
 
-               $sql = "SELECT relhasoids FROM pg_class WHERE relname='{$table}' 
-                       AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname='{$this->_schema}')";
+               $sql = "SELECT relhasoids FROM pg_catalog.pg_class WHERE relname='{$table}' 
+                       AND relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname='{$this->_schema}')";
 
                $rs = $this->selectSet($sql);
                if ($rs->recordCount() != 1) return -99;
@@ -214,8 +214,8 @@ class Postgres73 extends Postgres72 {
 
                if (sizeof($atts) == 0) return array();
 
-               $sql = "SELECT attnum, attname FROM pg_attribute WHERE 
-                       attrelid=(SELECT oid FROM pg_class WHERE relname='{$table}'AND
+               $sql = "SELECT attnum, attname FROM pg_catalog.pg_attribute WHERE 
+                       attrelid=(SELECT oid FROM pg_catalog.pg_class WHERE relname='{$table}'AND
                        relnamespace=(SELECT oid FROM pg_catalog.pg_namespace WHERE nspname='{$this->_schema}')) 
                        AND attnum IN ('" . join("','", $atts) . "')";
 
@@ -246,8 +246,8 @@ class Postgres73 extends Postgres72 {
                $status = $this->beginTransaction();
                if ($status != 0) return -1;
                
-               $sql = "SELECT indrelid, indkey FROM pg_index WHERE indisunique AND 
-                       indrelid=(SELECT oid FROM pg_class WHERE relname='{$table}' AND
+               $sql = "SELECT indrelid, indkey FROM pg_catalog.pg_index WHERE indisunique AND 
+                       indrelid=(SELECT oid FROM pg_catalog.pg_class WHERE relname='{$table}' AND
                        relnamespace=(SELECT oid FROM pg_catalog.pg_namespace WHERE nspname='{$this->_schema}'))";
                $rs = $this->selectSet($sql);
 
@@ -276,7 +276,7 @@ class Postgres73 extends Postgres72 {
         * @return All tables, sorted alphabetically 
         */
        function &getTables() {
-               $sql = "SELECT tablename, tableowner FROM pg_tables
+               $sql = "SELECT tablename, tableowner FROM pg_catalog.pg_tables
                        WHERE schemaname='{$this->_schema}' ORDER BY tablename";
 
                return $this->selectSet($sql);
@@ -370,7 +370,7 @@ class Postgres73 extends Postgres72 {
         * @return All views
         */
        function getViews() {
-               $sql = "SELECT viewname, viewowner FROM pg_views
+               $sql = "SELECT viewname, viewowner FROM pg_catalog.pg_views
                        WHERE schemaname='{$this->_schema}' ORDER BY viewname";
 
                return $this->selectSet($sql);
@@ -779,8 +779,8 @@ class Postgres73 extends Postgres72 {
                                        pc.oid=pi.indexrelid
                                        AND (pi.indisunique OR pi.indisprimary)
                        ) AS sub
-                       WHERE relid = (SELECT oid FROM pg_class WHERE relname='{$table}'
-                                       AND relnamespace = (SELECT oid FROM pg_namespace
+                       WHERE relid = (SELECT oid FROM pg_catalog.pg_class WHERE relname='{$table}'
+                                       AND relnamespace = (SELECT oid FROM pg_catalog.pg_namespace
                                        WHERE nspname='{$this->_schema}'))
                ";
 
@@ -824,22 +824,22 @@ class Postgres73 extends Postgres72 {
                        case 'table':
                        case 'view':
                        case 'sequence':
-                               $sql = "SELECT relacl AS acl FROM pg_class WHERE relname='{$object}'
-                                               AND relnamespace=(SELECT oid FROM pg_namespace WHERE nspname='{$this->_schema}')";
+                               $sql = "SELECT relacl AS acl FROM pg_catalog.pg_class WHERE relname='{$object}'
+                                               AND relnamespace=(SELECT oid FROM pg_catalog.pg_namespace WHERE nspname='{$this->_schema}')";
                                break;
                        case 'database':
-                               $sql = "SELECT datacl AS acl FROM pg_database WHERE datname='{$object}'";
+                               $sql = "SELECT datacl AS acl FROM pg_catalog.pg_database WHERE datname='{$object}'";
                                break;
                        case 'function':
                                // Since we fetch functions by oid, they are already constrained to
                                // the current schema.
-                               $sql = "SELECT proacl AS acl FROM pg_proc WHERE oid='{$object}'";
+                               $sql = "SELECT proacl AS acl FROM pg_catalog.pg_proc WHERE oid='{$object}'";
                                break;
                        case 'language':
-                               $sql = "SELECT lanacl AS acl FROM pg_language WHERE lanname='{$object}'";
+                               $sql = "SELECT lanacl AS acl FROM pg_catalog.pg_language WHERE lanname='{$object}'";
                                break;
                        case 'schema':
-                               $sql = "SELECT nspacl AS acl FROM pg_namespace WHERE nspname='{$object}'";
+                               $sql = "SELECT nspacl AS acl FROM pg_catalog.pg_namespace WHERE nspname='{$object}'";
                                break;
                        default:
                                return -1;
@@ -908,6 +908,66 @@ class Postgres73 extends Postgres72 {
                return $temp;
        }
        
+       // Domain functions
+       
+       /**
+        * Return all domains in current schema.  Excludes domain constraints.
+        * @return All tables, sorted alphabetically 
+        */
+       function &getDomains() {
+               $sql = "                
+                       SELECT
+                               t.typname AS domname, 
+                               pg_catalog.format_type(t.typbasetype, t.typtypmod) AS domtype,
+                               t.typnotnull AS domnotnull,
+                               t.typdefault AS domdef,
+                               pg_catalog.pg_get_userbyid(t.typowner) AS domowner
+                       FROM 
+                               pg_catalog.pg_type t
+                       WHERE 
+                               t.typtype = 'd'\r
+                               AND t.typnamespace = (SELECT oid FROM pg_catalog.pg_namespace
+                                       WHERE nspname='{$this->_schema}')\r
+                       ORDER BY t.typname";\r
+
+               return $this->selectSet($sql);
+       }
+
+       /**
+        * Creates a domain
+        * @param $domain The name of the domain to create
+        * @param $type The base type for the domain
+        * @param $notnull True for NOT NULL, false otherwise
+        * @param $default Default value for domain     
+        * @param $check A CHECK constraint if there is one
+        * @return 0 success
+        */
+       function createDomain($domain, $type, $notnull, $default, $check) {
+               $this->fieldClean($domain);
+               
+               $sql = "CREATE DOMAIN \"{$domain}\" AS {$type}";
+               if ($notnull) $sql .= ' NOT NULL';
+               if ($default != '') $sql .= " DEFAULT {$default}";
+               if ($this->hasDomainConstraints() && $check != '') $sql .= " CHECK ({$check})";
+
+               return $this->execute($sql);
+       }
+       
+       /**
+        * Drops a domain.
+        * @param $domain The name of the domain to drop
+        * @param $cascade True to cascade drop, false to restrict
+        * @return 0 success
+        */
+       function dropDomain($domain, $cascade) {
+               $this->fieldClean($domain);
+
+               $sql = "DROP DOMAIN \"{$domain}\"";
+               if ($cascade) $sql .= " CASCADE";
+
+               return $this->execute($sql);
+       }       
+       
        // Find object functions
        
        /**
@@ -955,6 +1015,7 @@ class Postgres73 extends Postgres72 {
        function hasCluster() { return true; }
        function hasDropBehavior() { return true; }
        function hasDropColumn() { return true; }
+       function hasDomains() { return true; }
 
 }
 
index c2823c8e315385a2d408c304a0b17a6d04ab04d1..175ffab6a0da8d76d914abdef0fa1159080cfcac 100644 (file)
@@ -4,7 +4,7 @@
  * A class that implements the DB interface for Postgres
  * Note: This class uses ADODB and returns RecordSets.
  *
- * $Id: Postgres74.php,v 1.5 2003/03/27 12:56:30 chriskl Exp $
+ * $Id: Postgres74.php,v 1.6 2003/07/29 09:07:09 chriskl Exp $
  */
 
 include_once('classes/database/Postgres73.php');
@@ -83,6 +83,7 @@ class Postgres74 extends Postgres73 {
 
        // Capabilities
        function hasGrantOption() { return true; }
+       function hasDomainConstraints() { return true; }
        
 }
 
index c0ba682edb07a2a29ee2ba5f35273c2c9a7840e9..5c8b3556e077f08d784959382e28ccf8f6c3d29e 100755 (executable)
@@ -4,7 +4,7 @@
         * English language file for phpPgAdmin.  Use this as a basis
         * for new translations.
         *
-        * $Id: english.php,v 1.85 2003/07/28 07:50:32 chriskl Exp $
+        * $Id: english.php,v 1.86 2003/07/29 09:07:09 chriskl Exp $
         */
 
        // Language and character set
        $lang['strreportcreated'] = 'Report saved.';
        $lang['strreportcreatedbad'] = 'Failed to save report.';
 
+       // Domains
+       $lang['strdomain'] = 'Domain';
+       $lang['strdomains'] = 'Domains';
+       $lang['strshowalldomains'] = 'Show all domains';
+       $lang['strnodomains'] = 'No domains found.';
+       $lang['strcreatedomain'] = 'Create Domain';
+       $lang['strdomaindropped'] = 'Domain dropped.';
+       $lang['strdomaindroppedbad'] = 'Domain drop failed.';
+       $lang['strconfdropdomain'] = 'Are you sure you want to drop the domain "%s"?';
+       $lang['strdomainneedsname'] = 'You must give a name for your domain.';
+       $lang['strdomaincreated'] = 'Domain created.';
+       $lang['strdomaincreatedbad'] = 'Failed to create domain.';      
+
        // Miscellaneous
        $lang['strtopbar'] = '%s running on %s:%s -- You are logged in as user "%s", %s';
        $lang['strtimefmt'] = 'jS M, Y g:iA';
index 966d40d80d16796c7df0857936dbbac232a99942..5034da4e9a293db59113be3ef90554b50aea313d 100644 (file)
@@ -4,7 +4,7 @@
         * English language file for phpPgAdmin.  Use this as a basis
         * for new translations.
         *
-        * $Id: english.php,v 1.37 2003/07/28 07:50:32 chriskl Exp $
+        * $Id: english.php,v 1.38 2003/07/29 09:07:09 chriskl Exp $
         */
 
        // Language and character set
        $lang['strreportcreated'] = 'Report saved.';
        $lang['strreportcreatedbad'] = 'Failed to save report.';
 
+       // Domains
+       $lang['strdomain'] = 'Domain';
+       $lang['strdomains'] = 'Domains';
+       $lang['strshowalldomains'] = 'Show all domains';
+       $lang['strnodomains'] = 'No domains found.';
+       $lang['strcreatedomain'] = 'Create Domain';
+       $lang['strdomaindropped'] = 'Domain dropped.';
+       $lang['strdomaindroppedbad'] = 'Domain drop failed.';
+       $lang['strconfdropdomain'] = 'Are you sure you want to drop the domain &quot;%s&quot;?';
+       $lang['strdomainneedsname'] = 'You must give a name for your domain.';
+       $lang['strdomaincreated'] = 'Domain created.';
+       $lang['strdomaincreatedbad'] = 'Failed to create domain.';      
+
        // Miscellaneous
        $lang['strtopbar'] = '%s running on %s:%s -- You are logged in as user &quot;%s&quot;, %s';
        $lang['strtimefmt'] = 'jS M, Y g:iA';