]> git.joonet.de Git - adminer.git/commitdiff
Faster foreign keys
authorJan Dolecek <juzna.cz@gmail.com>
Mon, 1 Aug 2011 08:47:45 +0000 (09:47 +0100)
committerJakub Vrana <jakub@vrana.cz>
Tue, 2 Aug 2011 15:33:00 +0000 (17:33 +0200)
adminer/drivers/pgsql.inc.php

index ee66cd156f21c9df13f6cee9833351d64e57ad24..041cf252f556e0fdfec719f19d01ce974e2cca92 100644 (file)
@@ -270,19 +270,19 @@ ORDER BY a.attnum"
        
        function foreign_keys($table) {
                $return = array();
-               foreach (get_rows("SELECT tc.constraint_name, kcu.column_name, rc.update_rule AS on_update, rc.delete_rule AS on_delete, unique_constraint_schema AS ns, ccu.table_name AS table, ccu.column_name AS ref
-FROM information_schema.table_constraints tc
-LEFT JOIN information_schema.key_column_usage kcu USING (constraint_catalog, constraint_schema, constraint_name)
-LEFT JOIN information_schema.referential_constraints rc USING (constraint_catalog, constraint_schema, constraint_name)
-LEFT JOIN information_schema.constraint_column_usage ccu ON rc.unique_constraint_catalog = ccu.constraint_catalog AND rc.unique_constraint_schema = ccu.constraint_schema AND rc.unique_constraint_name = ccu.constraint_name
-WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.constraint_schema = current_schema() AND tc.table_name = " . q($table) //! there can be more unique_constraint_name
-               ) as $row) {
-                       $foreign_key = &$return[$row["constraint_name"]];
-                       if (!$foreign_key) {
-                               $foreign_key = $row;
+               foreach (get_rows("SELECT conname, (SELECT nspname FROM pg_namespace WHERE oid = connamespace) AS ns, pg_get_constraintdef(oid) AS definition
+FROM pg_constraint
+WHERE conrelid = (SELECT oid FROM pg_class WHERE relname = " . q($table) . ")
+AND contype = 'f'::char
+ORDER BY conkey, conname") as $row) {
+                       if (preg_match('~FOREIGN KEY\s*\((.+)\)\s*REFERENCES (.+)\((.+)\)(.*)$~iA', $row['definition'], $match)) {
+                               $row['source'] = array_map('trim', explode(',', $match[1]));
+                               $row['table'] = $match[2];
+                               $row['target'] = array_map('trim', explode(',', $match[3]));
+                               $row['on_delete'] = (preg_match('~ON DELETE (CASCADE|SET NULL|RESTRICT|NO ACTION)~', $match[4], $match2) ? $match2[1] : 'NO ACTION');
+                               $row['on_update'] = (preg_match('~ON UPDATE (CASCADE|SET NULL|RESTRICT|NO ACTION)~', $match[4], $match2) ? $match2[1] : 'NO ACTION');
+                               $return[$row['conname']] = $row;
                        }
-                       $foreign_key["source"][] = $row["column_name"];
-                       $foreign_key["target"][] = $row["ref"];
                }
                return $return;
        }