X-Git-Url: http://git.kpe.io/?p=clsql.git;a=blobdiff_plain;f=sql%2Fgeneric-postgresql.lisp;h=a2dd4372daf6d9c30d8fd925b48b99a4fefa6bd6;hp=aac16ddc85acad1727bca12b56ce0028ce44c056;hb=9ba5ee2647740aca7777ac12a21db32837f3f2b6;hpb=6f9c91e01227e25e36560220628269258c80712d diff --git a/sql/generic-postgresql.lisp b/sql/generic-postgresql.lisp index aac16dd..a2dd437 100644 --- a/sql/generic-postgresql.lisp +++ b/sql/generic-postgresql.lisp @@ -15,7 +15,7 @@ (in-package #:clsql-sys) (defclass generic-postgresql-database (database) - () + ((has-table-pg_roles :type boolean :reader has-table-pg_roles :initform nil)) (:documentation "Encapsulate same behavior across postgresql and postgresql-socket backends.")) @@ -70,14 +70,42 @@ " AND (relowner=(SELECT usesysid FROM pg_user WHERE (usename='~A')))" owner)) ((null owner) - (format nil " AND (NOT (relowner=1))")) + (format nil " AND (relowner<>(SELECT usesysid FROM pg_user WHERE usename='postgres'))")) (t ""))) +(defun has-table (name database) + (let ((name-retrieved + (caar (database-query + (format nil "SELECT relname FROM pg_class WHERE relname='~A'" + name) + database nil nil)))) + (if (and (stringp name-retrieved) (plusp (length name-retrieved))) + t + nil))) + +(defmethod slot-unbound (class (obj generic-postgresql-database) + (slot (eql 'has-table-pg_roles))) + ;; Lazily cache slot value + (declare (ignore class)) + (setf (slot-value obj 'has-table-pg_roles) (has-table "pg_roles" obj))) + (defun database-list-objects-of-type (database type owner) (mapcar #'car (database-query (format nil - "SELECT relname FROM pg_class WHERE (relkind = '~A')~A" + (if (and (has-table-pg_roles database) + (not (eq owner :all))) + " + SELECT c.relname + FROM pg_catalog.pg_class c + LEFT JOIN pg_catalog.pg_roles r ON r.oid = c.relowner + LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace + WHERE c.relkind IN ('~A','') + AND n.nspname NOT IN ('pg_catalog', 'pg_toast') + AND pg_catalog.pg_table_is_visible(c.oid) + ~A" + "SELECT relname FROM pg_class WHERE (relkind = +'~A')~A") type (owner-clause owner)) database nil nil)))