@@ 847-988 (lines=142) @@ | ||
844 | * @param $filter The object type to restrict to ('' means no restriction) |
|
845 | * @return A recordset |
|
846 | */ |
|
847 | public function findObject($term, $filter) |
|
848 | { |
|
849 | $conf = $this->conf; |
|
850 | ||
851 | /*about escaping: |
|
852 | * SET standard_conforming_string is not available before 8.2 |
|
853 | * So we must use PostgreSQL specific notation :/ |
|
854 | * E'' notation is not available before 8.1 |
|
855 | * $$ is available since 8.0 |
|
856 | * Nothing specific from 7.4 |
|
857 | */ |
|
858 | ||
859 | // Escape search term for ILIKE match |
|
860 | $this->clean($term); |
|
861 | $this->clean($filter); |
|
862 | $term = str_replace('_', '\_', $term); |
|
863 | $term = str_replace('%', '\%', $term); |
|
864 | ||
865 | // Exclude system relations if necessary |
|
866 | if (!$conf['show_system']) { |
|
867 | // XXX: The mention of information_schema here is in the wrong place, but |
|
868 | // it's the quickest fix to exclude the info schema from 7.4 |
|
869 | $where = " AND pn.nspname NOT LIKE \$_PATERN_\$pg\_%\$_PATERN_\$ AND pn.nspname != 'information_schema'"; |
|
870 | $lan_where = 'AND pl.lanispl'; |
|
871 | } else { |
|
872 | $where = ''; |
|
873 | $lan_where = ''; |
|
874 | } |
|
875 | ||
876 | // Apply outer filter |
|
877 | $sql = ''; |
|
878 | if ($filter != '') { |
|
879 | $sql = 'SELECT * FROM ('; |
|
880 | } |
|
881 | ||
882 | $term = "\$_PATERN_\$%{$term}%\$_PATERN_\$"; |
|
883 | ||
884 | $sql .= " |
|
885 | SELECT 'SCHEMA' AS type, oid, NULL AS schemaname, NULL AS relname, nspname AS name |
|
886 | FROM pg_catalog.pg_namespace pn WHERE nspname ILIKE {$term} {$where} |
|
887 | UNION ALL |
|
888 | SELECT CASE WHEN relkind='r' THEN 'TABLE' WHEN relkind='v' THEN 'VIEW' WHEN relkind='S' THEN 'SEQUENCE' END, pc.oid, |
|
889 | pn.nspname, NULL, pc.relname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn |
|
890 | WHERE pc.relnamespace=pn.oid AND relkind IN ('r', 'v', 'S') AND relname ILIKE {$term} {$where} |
|
891 | UNION ALL |
|
892 | SELECT CASE WHEN pc.relkind='r' THEN 'COLUMNTABLE' ELSE 'COLUMNVIEW' END, NULL, pn.nspname, pc.relname, pa.attname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn, |
|
893 | pg_catalog.pg_attribute pa WHERE pc.relnamespace=pn.oid AND pc.oid=pa.attrelid |
|
894 | AND pa.attname ILIKE {$term} AND pa.attnum > 0 AND NOT pa.attisdropped AND pc.relkind IN ('r', 'v') {$where} |
|
895 | UNION ALL |
|
896 | SELECT 'FUNCTION', pp.oid, pn.nspname, NULL, pp.proname || '(' || pg_catalog.oidvectortypes(pp.proargtypes) || ')' FROM pg_catalog.pg_proc pp, pg_catalog.pg_namespace pn |
|
897 | WHERE pp.pronamespace=pn.oid AND NOT pp.proisagg AND pp.proname ILIKE {$term} {$where} |
|
898 | UNION ALL |
|
899 | SELECT 'INDEX', NULL, pn.nspname, pc.relname, pc2.relname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn, |
|
900 | pg_catalog.pg_index pi, pg_catalog.pg_class pc2 WHERE pc.relnamespace=pn.oid AND pc.oid=pi.indrelid |
|
901 | AND pi.indexrelid=pc2.oid |
|
902 | AND NOT EXISTS ( |
|
903 | SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c |
|
904 | ON (d.refclassid = c.tableoid AND d.refobjid = c.oid) |
|
905 | WHERE d.classid = pc2.tableoid AND d.objid = pc2.oid AND d.deptype = 'i' AND c.contype IN ('u', 'p') |
|
906 | ) |
|
907 | AND pc2.relname ILIKE {$term} {$where} |
|
908 | UNION ALL |
|
909 | SELECT 'CONSTRAINTTABLE', NULL, pn.nspname, pc.relname, pc2.conname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn, |
|
910 | pg_catalog.pg_constraint pc2 WHERE pc.relnamespace=pn.oid AND pc.oid=pc2.conrelid AND pc2.conrelid != 0 |
|
911 | AND CASE WHEN pc2.contype IN ('f', 'c') THEN TRUE ELSE NOT EXISTS ( |
|
912 | SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c |
|
913 | ON (d.refclassid = c.tableoid AND d.refobjid = c.oid) |
|
914 | WHERE d.classid = pc2.tableoid AND d.objid = pc2.oid AND d.deptype = 'i' AND c.contype IN ('u', 'p') |
|
915 | ) END |
|
916 | AND pc2.conname ILIKE {$term} {$where} |
|
917 | UNION ALL |
|
918 | SELECT 'CONSTRAINTDOMAIN', pt.oid, pn.nspname, pt.typname, pc.conname FROM pg_catalog.pg_type pt, pg_catalog.pg_namespace pn, |
|
919 | pg_catalog.pg_constraint pc WHERE pt.typnamespace=pn.oid AND pt.oid=pc.contypid AND pc.contypid != 0 |
|
920 | AND pc.conname ILIKE {$term} {$where} |
|
921 | UNION ALL |
|
922 | SELECT 'TRIGGER', NULL, pn.nspname, pc.relname, pt.tgname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn, |
|
923 | pg_catalog.pg_trigger pt WHERE pc.relnamespace=pn.oid AND pc.oid=pt.tgrelid |
|
924 | AND ( pt.tgconstraint = 0 OR NOT EXISTS |
|
925 | (SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c |
|
926 | ON (d.refclassid = c.tableoid AND d.refobjid = c.oid) |
|
927 | WHERE d.classid = pt.tableoid AND d.objid = pt.oid AND d.deptype = 'i' AND c.contype = 'f')) |
|
928 | AND pt.tgname ILIKE {$term} {$where} |
|
929 | UNION ALL |
|
930 | SELECT 'RULETABLE', NULL, pn.nspname AS schemaname, c.relname AS tablename, r.rulename FROM pg_catalog.pg_rewrite r |
|
931 | JOIN pg_catalog.pg_class c ON c.oid = r.ev_class |
|
932 | LEFT JOIN pg_catalog.pg_namespace pn ON pn.oid = c.relnamespace |
|
933 | WHERE c.relkind='r' AND r.rulename != '_RETURN' AND r.rulename ILIKE {$term} {$where} |
|
934 | UNION ALL |
|
935 | SELECT 'RULEVIEW', NULL, pn.nspname AS schemaname, c.relname AS tablename, r.rulename FROM pg_catalog.pg_rewrite r |
|
936 | JOIN pg_catalog.pg_class c ON c.oid = r.ev_class |
|
937 | LEFT JOIN pg_catalog.pg_namespace pn ON pn.oid = c.relnamespace |
|
938 | WHERE c.relkind='v' AND r.rulename != '_RETURN' AND r.rulename ILIKE {$term} {$where} |
|
939 | "; |
|
940 | ||
941 | // Add advanced objects if show_advanced is set |
|
942 | if ($conf['show_advanced']) { |
|
943 | $sql .= " |
|
944 | UNION ALL |
|
945 | SELECT CASE WHEN pt.typtype='d' THEN 'DOMAIN' ELSE 'TYPE' END, pt.oid, pn.nspname, NULL, |
|
946 | pt.typname FROM pg_catalog.pg_type pt, pg_catalog.pg_namespace pn |
|
947 | WHERE pt.typnamespace=pn.oid AND typname ILIKE {$term} |
|
948 | AND (pt.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = pt.typrelid)) |
|
949 | {$where} |
|
950 | UNION ALL |
|
951 | SELECT 'OPERATOR', po.oid, pn.nspname, NULL, po.oprname FROM pg_catalog.pg_operator po, pg_catalog.pg_namespace pn |
|
952 | WHERE po.oprnamespace=pn.oid AND oprname ILIKE {$term} {$where} |
|
953 | UNION ALL |
|
954 | SELECT 'CONVERSION', pc.oid, pn.nspname, NULL, pc.conname FROM pg_catalog.pg_conversion pc, |
|
955 | pg_catalog.pg_namespace pn WHERE pc.connamespace=pn.oid AND conname ILIKE {$term} {$where} |
|
956 | UNION ALL |
|
957 | SELECT 'LANGUAGE', pl.oid, NULL, NULL, pl.lanname FROM pg_catalog.pg_language pl |
|
958 | WHERE lanname ILIKE {$term} {$lan_where} |
|
959 | UNION ALL |
|
960 | SELECT DISTINCT ON (p.proname) 'AGGREGATE', p.oid, pn.nspname, NULL, p.proname FROM pg_catalog.pg_proc p |
|
961 | LEFT JOIN pg_catalog.pg_namespace pn ON p.pronamespace=pn.oid |
|
962 | WHERE p.proisagg AND p.proname ILIKE {$term} {$where} |
|
963 | UNION ALL |
|
964 | SELECT DISTINCT ON (po.opcname) 'OPCLASS', po.oid, pn.nspname, NULL, po.opcname FROM pg_catalog.pg_opclass po, |
|
965 | pg_catalog.pg_namespace pn WHERE po.opcnamespace=pn.oid |
|
966 | AND po.opcname ILIKE {$term} {$where} |
|
967 | "; |
|
968 | } // Otherwise just add domains |
|
969 | else { |
|
970 | $sql .= " |
|
971 | UNION ALL |
|
972 | SELECT 'DOMAIN', pt.oid, pn.nspname, NULL, |
|
973 | pt.typname FROM pg_catalog.pg_type pt, pg_catalog.pg_namespace pn |
|
974 | WHERE pt.typnamespace=pn.oid AND pt.typtype='d' AND typname ILIKE {$term} |
|
975 | AND (pt.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = pt.typrelid)) |
|
976 | {$where} |
|
977 | "; |
|
978 | } |
|
979 | ||
980 | if ($filter != '') { |
|
981 | // We use like to make RULE, CONSTRAINT and COLUMN searches work |
|
982 | $sql .= ") AS sub WHERE type LIKE '{$filter}%' "; |
|
983 | } |
|
984 | ||
985 | $sql .= 'ORDER BY type, schemaname, relname, name'; |
|
986 | ||
987 | return $this->selectSet($sql); |
|
988 | } |
|
989 | ||
990 | /** |
|
991 | * Returns all available variable information. |
@@ 104-243 (lines=140) @@ | ||
101 | * @param $filter The object type to restrict to ('' means no restriction) |
|
102 | * @return A recordset |
|
103 | */ |
|
104 | public function findObject($term, $filter) |
|
105 | { |
|
106 | $conf = $this->conf; |
|
107 | ||
108 | /*about escaping: |
|
109 | * SET standard_conforming_string is not available before 8.2 |
|
110 | * So we must use PostgreSQL specific notation :/ |
|
111 | * E'' notation is not available before 8.1 |
|
112 | * $$ is available since 8.0 |
|
113 | * Nothing specific from 7.4 |
|
114 | */ |
|
115 | ||
116 | // Escape search term for ILIKE match |
|
117 | $term = str_replace('_', '\\_', $term); |
|
118 | $term = str_replace('%', '\\%', $term); |
|
119 | $this->clean($term); |
|
120 | $this->clean($filter); |
|
121 | ||
122 | // Exclude system relations if necessary |
|
123 | if (!$conf['show_system']) { |
|
124 | // XXX: The mention of information_schema here is in the wrong place, but |
|
125 | // it's the quickest fix to exclude the info schema from 7.4 |
|
126 | $where = " AND pn.nspname NOT LIKE 'pg\\\\_%' AND pn.nspname != 'information_schema'"; |
|
127 | $lan_where = 'AND pl.lanispl'; |
|
128 | } else { |
|
129 | $where = ''; |
|
130 | $lan_where = ''; |
|
131 | } |
|
132 | ||
133 | // Apply outer filter |
|
134 | $sql = ''; |
|
135 | if ($filter != '') { |
|
136 | $sql = 'SELECT * FROM ('; |
|
137 | } |
|
138 | ||
139 | $sql .= " |
|
140 | SELECT 'SCHEMA' AS type, oid, NULL AS schemaname, NULL AS relname, nspname AS name |
|
141 | FROM pg_catalog.pg_namespace pn WHERE nspname ILIKE '%{$term}%' {$where} |
|
142 | UNION ALL |
|
143 | SELECT CASE WHEN relkind='r' THEN 'TABLE' WHEN relkind='v' THEN 'VIEW' WHEN relkind='S' THEN 'SEQUENCE' END, pc.oid, |
|
144 | pn.nspname, NULL, pc.relname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn |
|
145 | WHERE pc.relnamespace=pn.oid AND relkind IN ('r', 'v', 'S') AND relname ILIKE '%{$term}%' {$where} |
|
146 | UNION ALL |
|
147 | SELECT CASE WHEN pc.relkind='r' THEN 'COLUMNTABLE' ELSE 'COLUMNVIEW' END, NULL, pn.nspname, pc.relname, pa.attname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn, |
|
148 | pg_catalog.pg_attribute pa WHERE pc.relnamespace=pn.oid AND pc.oid=pa.attrelid |
|
149 | AND pa.attname ILIKE '%{$term}%' AND pa.attnum > 0 AND NOT pa.attisdropped AND pc.relkind IN ('r', 'v') {$where} |
|
150 | UNION ALL |
|
151 | SELECT 'FUNCTION', pp.oid, pn.nspname, NULL, pp.proname || '(' || pg_catalog.oidvectortypes(pp.proargtypes) || ')' FROM pg_catalog.pg_proc pp, pg_catalog.pg_namespace pn |
|
152 | WHERE pp.pronamespace=pn.oid AND NOT pp.proisagg AND pp.proname ILIKE '%{$term}%' {$where} |
|
153 | UNION ALL |
|
154 | SELECT 'INDEX', NULL, pn.nspname, pc.relname, pc2.relname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn, |
|
155 | pg_catalog.pg_index pi, pg_catalog.pg_class pc2 WHERE pc.relnamespace=pn.oid AND pc.oid=pi.indrelid |
|
156 | AND pi.indexrelid=pc2.oid |
|
157 | AND NOT EXISTS ( |
|
158 | SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c |
|
159 | ON (d.refclassid = c.tableoid AND d.refobjid = c.oid) |
|
160 | WHERE d.classid = pc2.tableoid AND d.objid = pc2.oid AND d.deptype = 'i' AND c.contype IN ('u', 'p') |
|
161 | ) |
|
162 | AND pc2.relname ILIKE '%{$term}%' {$where} |
|
163 | UNION ALL |
|
164 | SELECT 'CONSTRAINTTABLE', NULL, pn.nspname, pc.relname, pc2.conname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn, |
|
165 | pg_catalog.pg_constraint pc2 WHERE pc.relnamespace=pn.oid AND pc.oid=pc2.conrelid AND pc2.conrelid != 0 |
|
166 | AND CASE WHEN pc2.contype IN ('f', 'c') THEN TRUE ELSE NOT EXISTS ( |
|
167 | SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c |
|
168 | ON (d.refclassid = c.tableoid AND d.refobjid = c.oid) |
|
169 | WHERE d.classid = pc2.tableoid AND d.objid = pc2.oid AND d.deptype = 'i' AND c.contype IN ('u', 'p') |
|
170 | ) END |
|
171 | AND pc2.conname ILIKE '%{$term}%' {$where} |
|
172 | UNION ALL |
|
173 | SELECT 'CONSTRAINTDOMAIN', pt.oid, pn.nspname, pt.typname, pc.conname FROM pg_catalog.pg_type pt, pg_catalog.pg_namespace pn, |
|
174 | pg_catalog.pg_constraint pc WHERE pt.typnamespace=pn.oid AND pt.oid=pc.contypid AND pc.contypid != 0 |
|
175 | AND pc.conname ILIKE '%{$term}%' {$where} |
|
176 | UNION ALL |
|
177 | SELECT 'TRIGGER', NULL, pn.nspname, pc.relname, pt.tgname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn, |
|
178 | pg_catalog.pg_trigger pt WHERE pc.relnamespace=pn.oid AND pc.oid=pt.tgrelid |
|
179 | AND ( pt.tgisconstraint = 'f' OR NOT EXISTS |
|
180 | (SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c |
|
181 | ON (d.refclassid = c.tableoid AND d.refobjid = c.oid) |
|
182 | WHERE d.classid = pt.tableoid AND d.objid = pt.oid AND d.deptype = 'i' AND c.contype = 'f')) |
|
183 | AND pt.tgname ILIKE '%{$term}%' {$where} |
|
184 | UNION ALL |
|
185 | SELECT 'RULETABLE', NULL, pn.nspname AS schemaname, c.relname AS tablename, r.rulename FROM pg_catalog.pg_rewrite r |
|
186 | JOIN pg_catalog.pg_class c ON c.oid = r.ev_class |
|
187 | LEFT JOIN pg_catalog.pg_namespace pn ON pn.oid = c.relnamespace |
|
188 | WHERE c.relkind='r' AND r.rulename != '_RETURN' AND r.rulename ILIKE '%{$term}%' {$where} |
|
189 | UNION ALL |
|
190 | SELECT 'RULEVIEW', NULL, pn.nspname AS schemaname, c.relname AS tablename, r.rulename FROM pg_catalog.pg_rewrite r |
|
191 | JOIN pg_catalog.pg_class c ON c.oid = r.ev_class |
|
192 | LEFT JOIN pg_catalog.pg_namespace pn ON pn.oid = c.relnamespace |
|
193 | WHERE c.relkind='v' AND r.rulename != '_RETURN' AND r.rulename ILIKE '%{$term}%' {$where} |
|
194 | "; |
|
195 | ||
196 | // Add advanced objects if show_advanced is set |
|
197 | if ($conf['show_advanced']) { |
|
198 | $sql .= " |
|
199 | UNION ALL |
|
200 | SELECT CASE WHEN pt.typtype='d' THEN 'DOMAIN' ELSE 'TYPE' END, pt.oid, pn.nspname, NULL, |
|
201 | pt.typname FROM pg_catalog.pg_type pt, pg_catalog.pg_namespace pn |
|
202 | WHERE pt.typnamespace=pn.oid AND typname ILIKE '%{$term}%' |
|
203 | AND (pt.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = pt.typrelid)) |
|
204 | {$where} |
|
205 | UNION ALL |
|
206 | SELECT 'OPERATOR', po.oid, pn.nspname, NULL, po.oprname FROM pg_catalog.pg_operator po, pg_catalog.pg_namespace pn |
|
207 | WHERE po.oprnamespace=pn.oid AND oprname ILIKE '%{$term}%' {$where} |
|
208 | UNION ALL |
|
209 | SELECT 'CONVERSION', pc.oid, pn.nspname, NULL, pc.conname FROM pg_catalog.pg_conversion pc, |
|
210 | pg_catalog.pg_namespace pn WHERE pc.connamespace=pn.oid AND conname ILIKE '%{$term}%' {$where} |
|
211 | UNION ALL |
|
212 | SELECT 'LANGUAGE', pl.oid, NULL, NULL, pl.lanname FROM pg_catalog.pg_language pl |
|
213 | WHERE lanname ILIKE '%{$term}%' {$lan_where} |
|
214 | UNION ALL |
|
215 | SELECT DISTINCT ON (p.proname) 'AGGREGATE', p.oid, pn.nspname, NULL, p.proname FROM pg_catalog.pg_proc p |
|
216 | LEFT JOIN pg_catalog.pg_namespace pn ON p.pronamespace=pn.oid |
|
217 | WHERE p.proisagg AND p.proname ILIKE '%{$term}%' {$where} |
|
218 | UNION ALL |
|
219 | SELECT DISTINCT ON (po.opcname) 'OPCLASS', po.oid, pn.nspname, NULL, po.opcname FROM pg_catalog.pg_opclass po, |
|
220 | pg_catalog.pg_namespace pn WHERE po.opcnamespace=pn.oid |
|
221 | AND po.opcname ILIKE '%{$term}%' {$where} |
|
222 | "; |
|
223 | } // Otherwise just add domains |
|
224 | else { |
|
225 | $sql .= " |
|
226 | UNION ALL |
|
227 | SELECT 'DOMAIN', pt.oid, pn.nspname, NULL, |
|
228 | pt.typname FROM pg_catalog.pg_type pt, pg_catalog.pg_namespace pn |
|
229 | WHERE pt.typnamespace=pn.oid AND pt.typtype='d' AND typname ILIKE '%{$term}%' |
|
230 | AND (pt.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = pt.typrelid)) |
|
231 | {$where} |
|
232 | "; |
|
233 | } |
|
234 | ||
235 | if ($filter != '') { |
|
236 | // We use like to make RULE, CONSTRAINT and COLUMN searches work |
|
237 | $sql .= ") AS sub WHERE type LIKE '{$filter}%' "; |
|
238 | } |
|
239 | ||
240 | $sql .= 'ORDER BY type, schemaname, relname, name'; |
|
241 | ||
242 | return $this->selectSet($sql); |
|
243 | } |
|
244 | ||
245 | /** |
|
246 | * Returns table locks information in the current database |
@@ 68-209 (lines=142) @@ | ||
65 | * @param $filter The object type to restrict to ('' means no restriction) |
|
66 | * @return A recordset |
|
67 | */ |
|
68 | public function findObject($term, $filter) |
|
69 | { |
|
70 | $conf = $this->conf; |
|
71 | ||
72 | /*about escaping: |
|
73 | * SET standard_conforming_string is not available before 8.2 |
|
74 | * So we must use PostgreSQL specific notation :/ |
|
75 | * E'' notation is not available before 8.1 |
|
76 | * $$ is available since 8.0 |
|
77 | * Nothing specific from 7.4 |
|
78 | */ |
|
79 | ||
80 | // Escape search term for ILIKE match |
|
81 | $this->clean($term); |
|
82 | $this->clean($filter); |
|
83 | $term = str_replace('_', '\_', $term); |
|
84 | $term = str_replace('%', '\%', $term); |
|
85 | ||
86 | // Exclude system relations if necessary |
|
87 | if (!$conf['show_system']) { |
|
88 | // XXX: The mention of information_schema here is in the wrong place, but |
|
89 | // it's the quickest fix to exclude the info schema from 7.4 |
|
90 | $where = " AND pn.nspname NOT LIKE \$_PATERN_\$pg\_%\$_PATERN_\$ AND pn.nspname != 'information_schema'"; |
|
91 | $lan_where = 'AND pl.lanispl'; |
|
92 | } else { |
|
93 | $where = ''; |
|
94 | $lan_where = ''; |
|
95 | } |
|
96 | ||
97 | // Apply outer filter |
|
98 | $sql = ''; |
|
99 | if ($filter != '') { |
|
100 | $sql = 'SELECT * FROM ('; |
|
101 | } |
|
102 | ||
103 | $term = "\$_PATERN_\$%{$term}%\$_PATERN_\$"; |
|
104 | ||
105 | $sql .= " |
|
106 | SELECT 'SCHEMA' AS type, oid, NULL AS schemaname, NULL AS relname, nspname AS name |
|
107 | FROM pg_catalog.pg_namespace pn WHERE nspname ILIKE {$term} {$where} |
|
108 | UNION ALL |
|
109 | SELECT CASE WHEN relkind='r' THEN 'TABLE' WHEN relkind='v' THEN 'VIEW' WHEN relkind='S' THEN 'SEQUENCE' END, pc.oid, |
|
110 | pn.nspname, NULL, pc.relname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn |
|
111 | WHERE pc.relnamespace=pn.oid AND relkind IN ('r', 'v', 'S') AND relname ILIKE {$term} {$where} |
|
112 | UNION ALL |
|
113 | SELECT CASE WHEN pc.relkind='r' THEN 'COLUMNTABLE' ELSE 'COLUMNVIEW' END, NULL, pn.nspname, pc.relname, pa.attname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn, |
|
114 | pg_catalog.pg_attribute pa WHERE pc.relnamespace=pn.oid AND pc.oid=pa.attrelid |
|
115 | AND pa.attname ILIKE {$term} AND pa.attnum > 0 AND NOT pa.attisdropped AND pc.relkind IN ('r', 'v') {$where} |
|
116 | UNION ALL |
|
117 | SELECT 'FUNCTION', pp.oid, pn.nspname, NULL, pp.proname || '(' || pg_catalog.oidvectortypes(pp.proargtypes) || ')' FROM pg_catalog.pg_proc pp, pg_catalog.pg_namespace pn |
|
118 | WHERE pp.pronamespace=pn.oid AND NOT pp.proisagg AND pp.proname ILIKE {$term} {$where} |
|
119 | UNION ALL |
|
120 | SELECT 'INDEX', NULL, pn.nspname, pc.relname, pc2.relname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn, |
|
121 | pg_catalog.pg_index pi, pg_catalog.pg_class pc2 WHERE pc.relnamespace=pn.oid AND pc.oid=pi.indrelid |
|
122 | AND pi.indexrelid=pc2.oid |
|
123 | AND NOT EXISTS ( |
|
124 | SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c |
|
125 | ON (d.refclassid = c.tableoid AND d.refobjid = c.oid) |
|
126 | WHERE d.classid = pc2.tableoid AND d.objid = pc2.oid AND d.deptype = 'i' AND c.contype IN ('u', 'p') |
|
127 | ) |
|
128 | AND pc2.relname ILIKE {$term} {$where} |
|
129 | UNION ALL |
|
130 | SELECT 'CONSTRAINTTABLE', NULL, pn.nspname, pc.relname, pc2.conname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn, |
|
131 | pg_catalog.pg_constraint pc2 WHERE pc.relnamespace=pn.oid AND pc.oid=pc2.conrelid AND pc2.conrelid != 0 |
|
132 | AND CASE WHEN pc2.contype IN ('f', 'c') THEN TRUE ELSE NOT EXISTS ( |
|
133 | SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c |
|
134 | ON (d.refclassid = c.tableoid AND d.refobjid = c.oid) |
|
135 | WHERE d.classid = pc2.tableoid AND d.objid = pc2.oid AND d.deptype = 'i' AND c.contype IN ('u', 'p') |
|
136 | ) END |
|
137 | AND pc2.conname ILIKE {$term} {$where} |
|
138 | UNION ALL |
|
139 | SELECT 'CONSTRAINTDOMAIN', pt.oid, pn.nspname, pt.typname, pc.conname FROM pg_catalog.pg_type pt, pg_catalog.pg_namespace pn, |
|
140 | pg_catalog.pg_constraint pc WHERE pt.typnamespace=pn.oid AND pt.oid=pc.contypid AND pc.contypid != 0 |
|
141 | AND pc.conname ILIKE {$term} {$where} |
|
142 | UNION ALL |
|
143 | SELECT 'TRIGGER', NULL, pn.nspname, pc.relname, pt.tgname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn, |
|
144 | pg_catalog.pg_trigger pt WHERE pc.relnamespace=pn.oid AND pc.oid=pt.tgrelid |
|
145 | AND ( NOT pt.tgisconstraint OR NOT EXISTS |
|
146 | (SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c |
|
147 | ON (d.refclassid = c.tableoid AND d.refobjid = c.oid) |
|
148 | WHERE d.classid = pt.tableoid AND d.objid = pt.oid AND d.deptype = 'i' AND c.contype = 'f')) |
|
149 | AND pt.tgname ILIKE {$term} {$where} |
|
150 | UNION ALL |
|
151 | SELECT 'RULETABLE', NULL, pn.nspname AS schemaname, c.relname AS tablename, r.rulename FROM pg_catalog.pg_rewrite r |
|
152 | JOIN pg_catalog.pg_class c ON c.oid = r.ev_class |
|
153 | LEFT JOIN pg_catalog.pg_namespace pn ON pn.oid = c.relnamespace |
|
154 | WHERE c.relkind='r' AND r.rulename != '_RETURN' AND r.rulename ILIKE {$term} {$where} |
|
155 | UNION ALL |
|
156 | SELECT 'RULEVIEW', NULL, pn.nspname AS schemaname, c.relname AS tablename, r.rulename FROM pg_catalog.pg_rewrite r |
|
157 | JOIN pg_catalog.pg_class c ON c.oid = r.ev_class |
|
158 | LEFT JOIN pg_catalog.pg_namespace pn ON pn.oid = c.relnamespace |
|
159 | WHERE c.relkind='v' AND r.rulename != '_RETURN' AND r.rulename ILIKE {$term} {$where} |
|
160 | "; |
|
161 | ||
162 | // Add advanced objects if show_advanced is set |
|
163 | if ($conf['show_advanced']) { |
|
164 | $sql .= " |
|
165 | UNION ALL |
|
166 | SELECT CASE WHEN pt.typtype='d' THEN 'DOMAIN' ELSE 'TYPE' END, pt.oid, pn.nspname, NULL, |
|
167 | pt.typname FROM pg_catalog.pg_type pt, pg_catalog.pg_namespace pn |
|
168 | WHERE pt.typnamespace=pn.oid AND typname ILIKE {$term} |
|
169 | AND (pt.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = pt.typrelid)) |
|
170 | {$where} |
|
171 | UNION ALL |
|
172 | SELECT 'OPERATOR', po.oid, pn.nspname, NULL, po.oprname FROM pg_catalog.pg_operator po, pg_catalog.pg_namespace pn |
|
173 | WHERE po.oprnamespace=pn.oid AND oprname ILIKE {$term} {$where} |
|
174 | UNION ALL |
|
175 | SELECT 'CONVERSION', pc.oid, pn.nspname, NULL, pc.conname FROM pg_catalog.pg_conversion pc, |
|
176 | pg_catalog.pg_namespace pn WHERE pc.connamespace=pn.oid AND conname ILIKE {$term} {$where} |
|
177 | UNION ALL |
|
178 | SELECT 'LANGUAGE', pl.oid, NULL, NULL, pl.lanname FROM pg_catalog.pg_language pl |
|
179 | WHERE lanname ILIKE {$term} {$lan_where} |
|
180 | UNION ALL |
|
181 | SELECT DISTINCT ON (p.proname) 'AGGREGATE', p.oid, pn.nspname, NULL, p.proname FROM pg_catalog.pg_proc p |
|
182 | LEFT JOIN pg_catalog.pg_namespace pn ON p.pronamespace=pn.oid |
|
183 | WHERE p.proisagg AND p.proname ILIKE {$term} {$where} |
|
184 | UNION ALL |
|
185 | SELECT DISTINCT ON (po.opcname) 'OPCLASS', po.oid, pn.nspname, NULL, po.opcname FROM pg_catalog.pg_opclass po, |
|
186 | pg_catalog.pg_namespace pn WHERE po.opcnamespace=pn.oid |
|
187 | AND po.opcname ILIKE {$term} {$where} |
|
188 | "; |
|
189 | } // Otherwise just add domains |
|
190 | else { |
|
191 | $sql .= " |
|
192 | UNION ALL |
|
193 | SELECT 'DOMAIN', pt.oid, pn.nspname, NULL, |
|
194 | pt.typname FROM pg_catalog.pg_type pt, pg_catalog.pg_namespace pn |
|
195 | WHERE pt.typnamespace=pn.oid AND pt.typtype='d' AND typname ILIKE {$term} |
|
196 | AND (pt.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = pt.typrelid)) |
|
197 | {$where} |
|
198 | "; |
|
199 | } |
|
200 | ||
201 | if ($filter != '') { |
|
202 | // We use like to make RULE, CONSTRAINT and COLUMN searches work |
|
203 | $sql .= ") AS sub WHERE type LIKE '{$filter}%' "; |
|
204 | } |
|
205 | ||
206 | $sql .= 'ORDER BY type, schemaname, relname, name'; |
|
207 | ||
208 | return $this->selectSet($sql); |
|
209 | } |
|
210 | ||
211 | // Capabilities |
|
212 |