(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."))
" 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)))