r9113: intial changes for list-table-indexes
[clsql.git] / db-postgresql / postgresql-sql.lisp
index b4eaa821662e0304b0b02c52542b4ef488b7b723..3d1eca3a2b614c4ec2a4d4576d22b72536514899 100644 (file)
 
 ;;; Object listing
 
+(defun owner-clause (owner)
+  (cond 
+   ((stringp owner)
+    (format
+     nil
+     " AND (relowner=(SELECT usesysid FROM pg_user WHERE (usename='~A')))" 
+     owner))
+   ((null owner)
+    (format nil " AND (NOT (relowner=1))"))
+   (t "")))
+
 (defmethod database-list-objects-of-type ((database postgresql-database)
                                           type owner)
-  (let ((owner-clause
-         (cond ((stringp owner)
-                (format nil " AND (relowner=(SELECT usesysid FROM pg_user WHERE (usename='~A')))" owner))
-               ((null owner)
-                (format nil " AND (NOT (relowner=1))"))
-               (t ""))))
-    (mapcar #'car
-            (database-query
-             (format nil
-                     "SELECT relname FROM pg_class WHERE (relkind = '~A')~A"
-                     type
-                     owner-clause)
-             database nil))))
-    
+  (mapcar #'car
+         (database-query
+          (format nil
+                  "SELECT relname FROM pg_class WHERE (relkind = '~A')~A"
+                  type
+                  (owner-clause owner))
+          database nil)))
+
 (defmethod database-list-tables ((database postgresql-database)
                                  &key (owner nil))
   (database-list-objects-of-type database "r" owner))
 (defmethod database-list-indexes ((database postgresql-database)
                                   &key (owner nil))
   (database-list-objects-of-type database "i" owner))
-  
+
+
+(defmethod database-list-table-indexes (table (database postgresql-database)
+                                       &key (owner nil))
+  (let ((indexrelids
+        (database-query
+         (format 
+          nil
+          "select indexrelid from pg_index where indrelid=(select relfilenode from pg_class where relname='~A'~A)"
+          (string-downcase table)
+          (owner-clause owner))
+         database :auto))
+       (result nil))
+    (dolist (indexrelid indexrelids (nreverse result))
+      (push 
+       (caar (database-query
+             (format nil "select relname from pg_class where relfilenode='~A'"
+                     (car indexrelid))
+             database
+             nil))
+       result))))
+
 (defmethod database-list-attributes ((table string)
                                     (database postgresql-database)
                                      &key (owner nil))
           (progn
             (setf (slot-value database 'clsql-base-sys::state) :open)
             (mapcar #'car (database-query "select datname from pg_database" 
-                                          database :auto)))
+                                          database nil)))
        (progn
          (database-disconnect database)
          (setf (slot-value database 'clsql-base-sys::state) :closed))))))