-(defmethod database-generate-column-definition (class slotdef (database generic-postgresql-database))
- ; handle autoincr slots special
- (when (or (and (listp (view-class-slot-db-constraints slotdef))
- (member :auto-increment (view-class-slot-db-constraints slotdef)))
- (eql :auto-increment (view-class-slot-db-constraints slotdef))
- (slot-value slotdef 'autoincrement-sequence))
- (let ((sequence-name (database-make-autoincrement-sequence class slotdef database)))
- (setf (view-class-slot-autoincrement-sequence slotdef) sequence-name)
- (cond ((listp (view-class-slot-db-constraints slotdef))
- (setf (view-class-slot-db-constraints slotdef)
- (remove :auto-increment
- (view-class-slot-db-constraints slotdef)))
- (unless (member :default (view-class-slot-db-constraints slotdef))
- (setf (view-class-slot-db-constraints slotdef)
- (append
- (list :default (format nil "nextval('~a')" sequence-name))
- (view-class-slot-db-constraints slotdef)))))
- (t
- (setf (view-class-slot-db-constraints slotdef)
- (list :default (format nil "nextval('~a')" sequence-name)))))))
- (call-next-method class slotdef database))
-
-(defmethod database-make-autoincrement-sequence (table column (database generic-postgresql-database))
- (let* ((table-name (view-table table))
- (column-name (view-class-slot-column column))
- (sequence-name (or (slot-value column 'autoincrement-sequence)
- (convert-to-db-default-case
- (format nil "~a_~a_SEQ" table-name column-name) database))))
- (unless (sequence-exists-p sequence-name :database database)
- (database-create-sequence sequence-name database))
- sequence-name))
+(defmethod database-generate-column-definition
+ (class slotdef (database generic-postgresql-database))
+ (when (member (view-class-slot-db-kind slotdef) '(:base :key))
+ (let ((cdef
+ (list (sql-expression :attribute (database-identifier slotdef database))
+ (specified-type slotdef)
+ (view-class-slot-db-type slotdef)))
+ (const (listify (view-class-slot-db-constraints slotdef)))
+ (seq (auto-increment-sequence-name class slotdef database)))
+ (when seq
+ (setf const (remove :auto-increment const))
+ (unless (member :default const)
+ (let* ((next (format nil "nextval('~a')" (escaped-database-identifier seq))))
+ (setf const (append const (list :default next))))))
+ (append cdef const))))
+
+(defmethod database-add-autoincrement-sequence
+ ((self standard-db-class) (database generic-postgresql-database))
+ (let ((ordered-slots (if (normalizedp self)
+ (ordered-class-direct-slots self)
+ (ordered-class-slots self))))
+ (dolist (slotdef ordered-slots)
+
+ ;; ensure that referenceed sequences actually exist before referencing them
+ (let ((sequence-name (auto-increment-sequence-name self slotdef database)))
+ (when (and sequence-name
+ (not (sequence-exists-p sequence-name :database database)))
+ (create-sequence sequence-name :database database))))))
+
+(defmethod database-remove-autoincrement-sequence
+ ((table standard-db-class)
+ (database generic-postgresql-database))
+ (let ((ordered-slots
+ (if (normalizedp table)
+ (ordered-class-direct-slots table)
+ (ordered-class-slots table))))
+ (dolist (slotdef ordered-slots)
+ ;; ensure that referenceed sequences are dropped with the table
+ (let ((sequence-name (auto-increment-sequence-name table slotdef database)))
+ (when sequence-name (drop-sequence sequence-name))))))