X-Git-Url: http://git.kpe.io/?p=clsql.git;a=blobdiff_plain;f=sql%2Fgeneric-postgresql.lisp;h=a2dd4372daf6d9c30d8fd925b48b99a4fefa6bd6;hp=4958eaa72b74eb9effd8e3bd693850efdacccf3b;hb=9ba5ee2647740aca7777ac12a21db32837f3f2b6;hpb=bc3cb0bc3161a02413f6df8611a60665348a762e diff --git a/sql/generic-postgresql.lisp b/sql/generic-postgresql.lisp index 4958eaa..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,18 +70,31 @@ " 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" - #+nil - (if (not (eq owner :all)) - ;; The below query fails on versions of postgresql - ;; (such as 7.4) that lack the pg_roles table + (if (and (has-table-pg_roles database) + (not (eq owner :all))) " SELECT c.relname FROM pg_catalog.pg_class c