X-Git-Url: http://git.kpe.io/?p=clsql.git;a=blobdiff_plain;f=sql%2Fooddl.lisp;h=09d879a020510582bfd75589265e9d8b21332b00;hp=d2158cc99091cbf36215b8d53b5c2df37268aaea;hb=1b07d2fd927cf8f1943ac0a0b8c980d1dc707076;hpb=225c02af1ae1c9c6f0b6c29eaf8319d48caae89f diff --git a/sql/ooddl.lisp b/sql/ooddl.lisp index d2158cc..09d879a 100644 --- a/sql/ooddl.lisp +++ b/sql/ooddl.lisp @@ -21,6 +21,9 @@ (:metaclass standard-db-class) (:documentation "Superclass for all CLSQL View Classes.")) +(defparameter *default-string-length* 255 + "The length of a string which does not have a user-specified length.") + (defvar *db-auto-sync* nil "A non-nil value means that creating View Class instances or setting their slots automatically creates/updates the @@ -50,12 +53,13 @@ (let* ((slot-name (%svuc-slot-name slot-def)) (slot-object (%svuc-slot-object slot-def class)) (slot-kind (view-class-slot-db-kind slot-object))) - (call-next-method) - (when (and *db-auto-sync* - (not *db-initializing*) - (not *db-deserializing*) - (not (eql slot-kind :virtual))) - (update-record-from-slot instance slot-name)))) + (prog1 + (call-next-method) + (when (and *db-auto-sync* + (not *db-initializing*) + (not *db-deserializing*) + (not (eql slot-kind :virtual))) + (update-record-from-slot instance slot-name))))) (defmethod initialize-instance ((object standard-db-object) &rest all-keys &key &allow-other-keys) @@ -71,28 +75,32 @@ ;; (defun create-view-from-class (view-class-name - &key (database *default-database*)) + &key (database *default-database*) + (transactions t)) "Creates a table as defined by the View Class VIEW-CLASS-NAME in DATABASE which defaults to *DEFAULT-DATABASE*." (let ((tclass (find-class view-class-name))) (if tclass (let ((*default-database* database)) - (%install-class tclass database)) + (%install-class tclass database :transactions transactions)) (error "Class ~s not found." view-class-name))) (values)) -(defmethod %install-class ((self standard-db-class) database &aux schemadef) - (dolist (slotdef (ordered-class-slots self)) - (let ((res (database-generate-column-definition (class-name self) - slotdef database))) - (when res - (push res schemadef)))) - (unless schemadef - (error "Class ~s has no :base slots" self)) - (create-table (sql-expression :table (view-table self)) (nreverse schemadef) - :database database - :constraints (database-pkey-constraint self database)) - (push self (database-view-classes database)) +(defmethod %install-class ((self standard-db-class) database + &key (transactions t)) + (let ((schemadef '())) + (dolist (slotdef (ordered-class-slots self)) + (let ((res (database-generate-column-definition (class-name self) + slotdef database))) + (when res + (push res schemadef)))) + (unless schemadef + (error "Class ~s has no :base slots" self)) + (create-table (sql-expression :table (view-table self)) (nreverse schemadef) + :database database + :transactions transactions + :constraints (database-pkey-constraint self database)) + (push self (database-view-classes database))) t) (defmethod database-pkey-constraint ((class standard-db-class) database) @@ -100,8 +108,8 @@ in DATABASE which defaults to *DEFAULT-DATABASE*." (when keylist (convert-to-db-default-case (format nil "CONSTRAINT ~APK PRIMARY KEY~A" - (database-output-sql (view-table class) database) - (database-output-sql keylist database)) + (sql-output (view-table class) database) + (sql-output keylist database)) database)))) (defmethod database-generate-column-definition (class slotdef database) @@ -113,7 +121,7 @@ in DATABASE which defaults to *DEFAULT-DATABASE*." (setf cdef (append cdef (list (view-class-slot-db-type slotdef)))) (let ((const (view-class-slot-db-constraints slotdef))) (when const - (setq cdef (append cdef (list const))))) + (setq cdef (append cdef (listify const))))) cdef))) @@ -121,20 +129,24 @@ in DATABASE which defaults to *DEFAULT-DATABASE*." ;; Drop the tables which store the given view class ;; -(defun drop-view-from-class (view-class-name &key (database *default-database*)) +(defun drop-view-from-class (view-class-name &key (database *default-database*) + (owner nil)) "Removes a table defined by the View Class VIEW-CLASS-NAME from DATABASE which defaults to *DEFAULT-DATABASE*." (let ((tclass (find-class view-class-name))) (if tclass (let ((*default-database* database)) - (%uninstall-class tclass)) + (%uninstall-class tclass :owner owner)) (error "Class ~s not found." view-class-name))) (values)) -(defun %uninstall-class (self &key (database *default-database*)) +(defun %uninstall-class (self &key + (database *default-database*) + (owner nil)) (drop-table (sql-expression :table (view-table self)) :if-does-not-exist :ignore - :database database) + :database database + :owner owner) (setf (database-view-classes database) (remove self (database-view-classes database))))