r11657: 25 Apr 2007 Kevin Rosenberg <kevin@rosenberg.net>
[clsql.git] / sql / ooddl.lisp
index d2158cc99091cbf36215b8d53b5c2df37268aaea..09d879a020510582bfd75589265e9d8b21332b00 100644 (file)
@@ -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
   (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)
 ;;
 
 (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))))