[Allow `update-foreign-relation-object' on non-persistent instances clinton@unknownlamer.org**20100617231348 Ignore-this: b68eca42c9de457756b25e8f27ca02bc * Ends up as a noop, but this simplifies some code elsewhere ] { hunk ./src/foreign-relation-slots.lisp 69 - (assert (and (persistentp dao) - (persistentp foreign-dao) - (table-name-compatible-with-slot slot foreign-dao)) + (assert (table-name-compatible-with-slot slot foreign-dao) hunk ./src/foreign-relation-slots.lisp 71 - "Dragons: ~A ~A ~A" dao slot foreign-dao) + "Table name incompatible with slot: ~A ~A ~A" dao slot foreign-dao) hunk ./src/foreign-relation-slots.lisp 75 - (pushnew foreign-dao (%foreign-mods-update %fm)) - (when-bind obsolete-dao (find foreign-dao - (slot-value dao (slot-definition-name slot)) - :test (lambda (e1 e2) (and (db= e1 e2) - (not (eq e1 e2))))) - (setf (slot-value dao (slot-definition-name slot)) - (nsubst foreign-dao obsolete-dao - (slot-value dao (slot-definition-name slot))))) + (cond ((persistentp foreign-dao) + (assert (persistentp dao) + (dao) + "Cannot update persistent foreign reference ~A to non-persistent object ~A" + foreign-dao dao) + (if-bind obsolete-dao (find foreign-dao + (slot-value dao + (slot-definition-name slot)) + :test (lambda (e1 e2) (and (db= e1 e2) + (not (eq e1 e2))))) + (progn (setf (slot-value dao (slot-definition-name slot)) + (nsubst foreign-dao obsolete-dao + (slot-value dao (slot-definition-name slot)))) + (pushnew foreign-dao (%foreign-mods-update %fm))) + (error "Foreign reference ~A not found in object ~A (~A)" + foreign-dao dao (slot-value dao (slot-definition-name slot))))) + ((not (persistentp dao)) + (unless (find foreign-dao (%foreign-mods-insert %fm) + :key #'car) + (error + "Foreign reference ~A not previously inserted in object ~A (~A)" + foreign-dao dao (slot-value dao (slot-definition-name slot))))) + (t (error "Object ~A and reference ~A must both be non-persistent or persistent" dao foreign-dao))) }