+(defun insert-object (object)
+ (let ((class (class-of object))
+ insert-query)
+ (flet ((ins (slotd &optional (val (slot-value-using-class class object slotd)))
+ (push (slot-definition-column-name slotd) insert-query)
+ (push val insert-query)))
+ (loop :for slotd in (class-slots class)
+ :do (cond ((slot-boundp-using-class class object slotd)
+ (unless (or (slot-definition-foreign-relation slotd)
+ (slot-definition-foreign-type slotd))
+ (ins slotd)))
+ ((slot-definition-primary-key-p slotd)
+ (setf (slot-value-using-class class object slotd) (get-default-value (class-table-name class)
+ (slot-definition-column-name slotd)))
+ (ins slotd ))))
+ (apply #'insert-into (class-table-name class) (nreverse insert-query))))
+ object)
+
+(defun select-using-object (object &key (combinator :and))
+ (let ((class (class-of object))
+ select-query)
+ (flet ((sel (slotd &optional (val (slot-value-using-class class object slotd)))
+ (push `(:ilike ,(slot-definition-column-name slotd) ,(if (stringp val)
+ (format nil "~A%" val) val)) select-query)))
+ (loop :for slotd in (class-slots class)
+ :do (cond ((slot-boundp-using-class class object slotd)
+ (unless (or (slot-definition-foreign-relation slotd)
+ (slot-definition-foreign-type slotd))
+ (sel slotd)))))
+ (if select-query
+ (select-objects (class-table-name class)
+ :where (print `(,combinator ,@(nreverse select-query))))
+ nil))))
+