Update-slots-from-instance now throws an exception if it generates an update without...
[clsql.git] / sql / oodml.lisp
index b570cedcbb96d6aa8e6ac9b10012ae33e47d2f71..466e86a55945fa280a6f3e0a8c7034e304087d00 100644 (file)
                                    (db-value-from-slot s val database))))
                        sds)))
     (cond ((and avps (view-database obj))
-           (update-records (sql-expression :table vct)
-                           :av-pairs avps
-                           :where (key-qualifier-for-instance
-                                   obj :database database)
-                           :database database))
+           (let ((where (key-qualifier-for-instance
+                         obj :database database)))
+             (unless where
+               (error "update-record-from-slots: could not generate a where clause for ~a" obj))
+             (update-records (sql-expression :table vct)
+                             :av-pairs avps
+                             :where where
+                             :database database)))
           ((and avps (not (view-database obj)))
            (insert-records :into (sql-expression :table vct)
                            :av-pairs avps
                    (setf pk (or pk
                                 (slot-value obj (slot-definition-name pk-slot))))))
                 (t
-                 (insert-records :into (sql-expression :table view-class-table)
+                (insert-records :into (sql-expression :table view-class-table)
                                  :av-pairs record-values
                                  :database database)
 
                                     (not (null (view-class-slot-autoincrement-sequence pk-slot))))
                                 (setf (slot-value obj (slot-definition-name pk-slot))
                                       (database-last-auto-increment-id database
-                                                                      table
+                                                                      view-class-table
                                                                       pk-slot)))))
-                 (setf pk (or pk
-                              (slot-value
-                               obj (slot-definition-name pk-slot)))))
-                 (when (eql this-class nil)
-                   (setf (slot-value obj 'view-database) database))))))
+                 (when pk-slot
+                   (setf pk (or pk
+                                (slot-value
+                                 obj (slot-definition-name pk-slot)))))
+                 (when (eql this-class nil)
+                   (setf (slot-value obj 'view-database) database)))))))
     ;; handle slots with defaults
-    (dolist (slot slots)
-      (when (and (slot-exists-p slot 'db-constraints)
-                (listp (view-class-slot-db-constraints slot))
-                (member :default (view-class-slot-db-constraints slot)))
-       (update-slot-from-record obj (slot-definition-name slot))))
+    (let* ((view-class (or this-class (class-of obj)))
+          (slots (if (normalizedp view-class)
+                    (ordered-class-direct-slots view-class)
+                    (ordered-class-slots view-class)))) 
+      (dolist (slot slots)
+       (when (and (slot-exists-p slot 'db-constraints)
+                  (listp (view-class-slot-db-constraints slot))
+                  (member :default (view-class-slot-db-constraints slot)))
+         (unless (and (slot-boundp obj (slot-definition-name slot))
+                      (slot-value obj (slot-definition-name slot)))
+           (update-slot-from-record obj (slot-definition-name slot))))))
 
     pk))