X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=sql%2Fmetaclasses.lisp;h=0dcb3aefea52033c2bc2b97129617ece76cf521e;hb=7cffee5771647bc8ab8dc6de6891fb3829523d32;hp=edb794298f3d374b088409c6e361185f592db15c;hpb=5990bfce392a05c10237d4f97b008c4f828028e5;p=clsql.git diff --git a/sql/metaclasses.lisp b/sql/metaclasses.lisp index edb7942..0dcb3ae 100644 --- a/sql/metaclasses.lisp +++ b/sql/metaclasses.lisp @@ -380,7 +380,6 @@ implementations." (defun compute-lisp-type-from-slot-specification (slotd specified-type) "Computes the Lisp type for a user-specified type. Needed for OpenMCL which does type checking before storing a value in a slot." - (declare (ignore slotd)) ;; This function is called after the base compute-effective-slots is called. ;; OpenMCL sets the type-predicate based on the initial value of the slots type. ;; so we have to override the type-predicates here @@ -394,9 +393,9 @@ which does type checking before storing a value in a slot." specified-type))) ((eq (ensure-keyword specified-type) :bigint) 'integer) - #+openmcl - ((null specified-type) - t) + ((and specified-type + (not (eql :not-null (slot-value slotd 'db-constraints)))) + `(or null ,specified-type)) (t specified-type))) @@ -470,17 +469,22 @@ which does type checking before storing a value in a slot." ) ;; all other slots (t - (change-class esd 'view-class-effective-slot-definition - #+allegro :name - #+allegro (slot-definition-name dsd)) + (let ((type-predicate #+openmcl (slot-value esd 'ccl::type-predicate))) + + (change-class esd 'view-class-effective-slot-definition + #+allegro :name + #+allegro (slot-definition-name dsd)) + #+openmcl (setf (slot-value esd 'ccl::type-predicate) + type-predicate)) (setf (slot-value esd 'column) (column-name-from-arg (sql-escape (slot-definition-name dsd)))) - + (setf (slot-value esd 'db-info) nil) - (setf (slot-value esd 'db-kind) - :virtual))) + (setf (slot-value esd 'db-kind) :virtual) + (setf (specified-type esd) (slot-definition-type dsd))) + ) esd))) (defun slotdefs-for-slots-with-class (slots class)