# Coverage for Doctrine_Import_Pgsql

Back to coverage report

1 | <?php
2 | /*
3 | * $Id: Pgsql.php 2963 2007-10-21 06:23:59Z Jonathan.Wage $
4 | *
5 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
6 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
7 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
9 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
10 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
11 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
12 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
13 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
14 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
15 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
16 | *
17 | * This software consists of voluntary contributions made by many individuals
18 | * and is licensed under the LGPL. For more information, see
19 | * <http://www.phpdoctrine.org>.
20 | */
21 | Doctrine::autoload('Doctrine_Import');
22 | /**
23 | * @package Doctrine
24 | * @subpackage Import
25 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
26 | * @author Konsta Vesterinen <kvesteri@cc.hut.fi>
27 | * @author Paul Cooper <pgc@ucecom.com>
28 | * @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
29 | * @version $Revision: 2963 $
30 | * @link www.phpdoctrine.org
31 | * @since 1.0
32 | */
33 | class Doctrine_Import_Pgsql extends Doctrine_Import
34 | {
35 |
36 | protected $sql = array(
37 | 'listDatabases' => 'SELECT datname FROM pg_database',
38 | 'listFunctions' => "SELECT
39 | proname
40 | FROM
41 | pg_proc pr,
42 | pg_type tp
43 | WHERE
44 | tp.oid = pr.prorettype
45 | AND pr.proisagg = FALSE
46 | AND tp.typname <> 'trigger'
47 | AND pr.pronamespace IN
48 | (SELECT oid FROM pg_namespace
49 | WHERE nspname NOT LIKE 'pg_%' AND nspname != 'information_schema'",
50 | 'listSequences' => "SELECT
51 | relname
52 | FROM
53 | pg_class
54 | WHERE relkind = 'S' AND relnamespace IN
55 | (SELECT oid FROM pg_namespace
56 | WHERE nspname NOT LIKE 'pg_%' AND nspname != 'information_schema')",
57 | 'listTables' => "SELECT
58 | c.relname AS table_name
59 | FROM pg_class c, pg_user u
60 | WHERE c.relowner = u.usesysid
61 | AND c.relkind = 'r'
62 | AND NOT EXISTS (SELECT 1 FROM pg_views WHERE viewname = c.relname)
63 | AND c.relname !~ '^(pg_|sql_)'
64 | UNION
65 | SELECT c.relname AS table_name
66 | FROM pg_class c
67 | WHERE c.relkind = 'r'
68 | AND NOT EXISTS (SELECT 1 FROM pg_views WHERE viewname = c.relname)
69 | AND NOT EXISTS (SELECT 1 FROM pg_user WHERE usesysid = c.relowner)
70 | AND c.relname !~ '^pg_'",
71 | 'listViews' => 'SELECT viewname FROM pg_views',
72 | 'listUsers' => 'SELECT usename FROM pg_user',
73 | 'listTableConstraints' => "SELECT
74 | relname
75 | FROM
76 | pg_class
77 | WHERE oid IN (
78 | SELECT indexrelid
79 | FROM pg_index, pg_class
80 | WHERE pg_class.relname = %s
81 | AND pg_class.oid = pg_index.indrelid
82 | AND (indisunique = 't' OR indisprimary = 't')
83 | )",
84 | 'listTableIndexes' => "SELECT
85 | relname
86 | FROM
87 | pg_class
88 | WHERE oid IN (
89 | SELECT indexrelid
90 | FROM pg_index, pg_class
91 | WHERE pg_class.relname = %s
92 | AND pg_class.oid=pg_index.indrelid
93 | AND indisunique != 't'
94 | AND indisprimary != 't'
95 | )",
96 | 'listTableColumns' => "SELECT
97 | a.attnum,
98 | a.attname AS field,
99 | t.typname AS type,
100 | format_type(a.atttypid, a.atttypmod) AS complete_type,
101 | a.attnotnull AS isnotnull,
102 | (SELECT 't'
103 | FROM pg_index
104 | WHERE c.oid = pg_index.indrelid
105 | AND pg_index.indkey[0] = a.attnum
106 | AND pg_index.indisprimary = 't'
107 | ) AS pri,
108 | (SELECT pg_attrdef.adsrc
109 | FROM pg_attrdef
110 | WHERE c.oid = pg_attrdef.adrelid
111 | AND pg_attrdef.adnum=a.attnum
112 | ) AS default
113 | FROM pg_attribute a, pg_class c, pg_type t
114 | WHERE c.relname = %s
115 | AND a.attnum > 0
116 | AND a.attrelid = c.oid
117 | AND a.atttypid = t.oid
118 | ORDER BY a.attnum",
119 | );
120 |
121 | /**
122 | * lists all database triggers
123 | *
124 | * @param string|null $database
125 | * @return array
126 | */
127 | public function listTriggers($database = null)
128 | {
129 |
130 | }
131 |
132 | /**
133 | * lists table constraints
134 | *
135 | * @param string $table database table name
136 | * @return array
137 | */
138 | public function listTableConstraints($table)
139 | {
140 | $table = $this->conn->quote($table);
141 | $query = sprintf($this->sql['listTableConstraints'], $table);
142 |
143 | return $this->conn->fetchColumn($query);
144 | }
145 |
146 | /**
147 | * lists table constraints
148 | *
149 | * @param string $table database table name
150 | * @return array
151 | */
152 | public function listTableColumns($table)
153 | {
154 | $table = $this->conn->quote($table);
155 | $query = sprintf($this->sql['listTableColumns'], $table);
156 | $result = $this->conn->fetchAssoc($query);
157 |
158 | $columns = array();
159 | foreach ($result as $key => $val) {
160 | $val = array_change_key_case($val, CASE_LOWER);
161 |
162 | if (strtolower($val['type']) === 'varchar') {
163 | // get length from varchar definition
164 | $length = preg_replace('~.*\(([0-9]*)\).*~', '$1', $val['complete_type']);
165 | $val['length'] = $length;
166 | }
167 |
168 | $decl = $this->conn->dataDict->getPortableDeclaration($val);
169 |
170 | $description = array(
171 | 'name' => $val['field'],
172 | 'ntype' => $val['type'],
173 | 'type' => $decl['type'][0],
174 | 'alltypes' => $decl['type'],
175 | 'length' => $decl['length'],
176 | 'fixed' => $decl['fixed'],
177 | 'unsigned' => $decl['unsigned'],
178 | 'notnull' => ($val['isnotnull'] == ''),
179 | 'default' => $val['default'],
180 | 'primary' => ($val['pri'] == 't'),
181 | );
182 | $columns[$val['field']] = $description;
183 | }
184 | return $columns;
185 | }
186 |
187 | /**
188 | * list all indexes in a table
189 | *
190 | * @param string $table database table name
191 | * @return array
192 | */
193 | public function listTableIndexes($table)
194 | {
195 | $table = $this->conn->quote($table);
196 | $query = sprintf($this->sql['listTableIndexes'], $table);
197 |
198 | return $this->conn->fetchColumn($query);
199 | }
200 |
201 | /**
202 | * lists tables
203 | *
204 | * @param string|null $database
205 | * @return array
206 | */
207 | public function listTables($database = null)
208 | {
209 | return $this->conn->fetchColumn($this->sql['listTables']);
210 | }
211 |
212 | /**
213 | * lists table triggers
214 | *
215 | * @param string $table database table name
216 | * @return array
217 | */
218 | public function listTableTriggers($table)
219 | {
220 | $query = 'SELECT trg.tgname AS trigger_name
221 | FROM pg_trigger trg,
222 | pg_class tbl
223 | WHERE trg.tgrelid = tbl.oid';
224 | if ($table !== null) {
225 | $table = $this->conn->quote(strtoupper($table), 'string');
226 | $query .= " AND tbl.relname = $table";
227 | }
228 | return $this->conn->fetchColumn($query);
229 | }
230 |
231 | /**
232 | * list the views in the database that reference a given table
233 | *
234 | * @param string $table database table name
235 | * @return array
236 | */
237 | public function listTableViews($table)
238 | {
239 | return $this->conn->fetchColumn($query);
240 | }
241 | }