+(defmethod update-records-from-instance :before ((view clsql::standard-db-object) &key database)
+ (declare (ignorable database))
+ (labels ((sym->sql (sym) (string-downcase (substitute #\_ #\- (string sym))))
+ (get-def (slot) (caar (query
+ (format nil "SELECT DISTINCT adsrc from pg_attrdef join pg_attribute on attnum = adnum where adrelid = (select oid from pg_class where relname = '~A') and attname = '~A'" (sym->sql (class-name (class-of view))) (sym->sql slot)))))
+ (get-default-value (slot) (caar (query (format nil "SELECT ~A" (get-def slot))))))
+
+ (dolist (slot (list-slots view))
+ (when (and (primary-key-p view slot)
+ (or (not (slot-boundp view slot))
+ (equal (slot-value view slot) nil)))
+ (setf (slot-value view slot) (get-default-value slot))))))
+
+;;;;
+
+(defmacro def-view-class/meta (name supers slots &rest args)
+ "Create and instrument CLSQL view-class NAME and
+appropriate meta-model class its default name is %NAME-meta-model."
+
+ (let ((model-name (cond ((eq :model-name (car args))
+ (pop args) ; remove keyword
+ (pop args)) ; get value
+ (t (intern (format nil "%~S-META-MODEL" name))))))
+