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