(%sequence-name-to-table sequence-name))
database :auto nil))))
+(defmethod database-last-auto-increment-id ((database mysql-database) table column)
+ (declare (ignore table column))
+ (car (query "SELECT LAST_INSERT_ID();"
+ :flatp t :field-names nil
+ :database database)))
+
(defmethod database-create (connection-spec (type (eql :mysql)))
(destructuring-bind (host name user password) connection-spec
(let ((database (database-connect (list host "" user password)
(defgeneric database-sequence-last (name database)
(:documentation "Select the last value in sequence NAME in DATABASE."))
+(defgeneric database-last-autoincrement-id (database table column)
+ (:documentation "Many databases have the notion of an auto-increment
+ id; i.e. a sequence implicitly on a table. This function should
+ return that ID." ))
+
(defgeneric database-start-transaction (database)
(:documentation "Start a transaction in DATABASE.")
(:method ((database t))
(defmethod database-set-sequence-position (name (position integer)
(database generic-postgresql-database))
(values
- (parse-integer
+ (parse-integer
(caar
(database-query
(format nil "SELECT SETVAL ('~A', ~A)" name position)
(concatenate 'string "SELECT LAST_VALUE FROM " sequence-name)
database nil nil)))))
+(defmethod database-last-auto-increment-id ((database generic-postgresql-database) table column)
+ (typecase table
+ (sql-ident (setf table (slot-value table 'name)))
+ (standard-db-class (setf table (view-table table))))
+ (typecase column
+ (sql-ident (setf column (slot-value column 'name)))
+ (view-class-slot-definition-mixin
+ (setf column (view-class-slot-column column))))
+ (let ((seq-name (format nil "~a_~a_seq" table column)))
+ (first (clsql:query (format nil "SELECT currval ('~a')" seq-name)
+ :flatp t
+ :database database
+ :result-types '(integer)))))
+
(defun postgresql-database-list (connection-spec type)
(destructuring-bind (host name &rest other-args) connection-spec
(declare (ignore name))
(defmethod db-type-has-prepared-stmt? ((db-type (eql :postgresql-socket)))
t)
+(defmethod db-type-has-auto-increment? ((db-type (eql :postgresql)))
+ t)
\ No newline at end of file
(list (sql-expression :attribute (view-class-slot-column slot))
(db-value-from-slot slot value database))))
- (get-pk (pk-slot)
- (if (member :auto-increment (listify (view-class-slot-db-constraints pk-slot)))
- (setf (slot-value obj (slot-definition-name pk-slot))
- ;;this should probably be moved into it's own function.
- (car (query "SELECT LAST_INSERT_ID();"
- :flatp t :field-names nil
- :database database)))
- (slot-value obj (slot-definition-name pk-slot))))
-
(save-slots-for-class (view-class stored-slot-defs)
(let ((pk-slot (car (keyslots-for-class view-class)))
(table (sql-expression :table (view-table view-class)))
:this-class view-class)
:database database)
(when (and pk-slot (not pk))
- (setf pk (slot-value obj (slot-definition-name pk-slot)))))
+ (setf pk (slot-value obj (slot-definition-name pk-slot))))
+ pk)
(t
(insert-records :into table
:av-pairs av-pairs
:database database)
- (when pk-slot
- (setf pk (or pk (get-pk pk-slot)))
-
- )))))))
+ (when (and pk-slot (not pk))
+ (setf pk (if (member :auto-increment (listify (view-class-slot-db-constraints pk-slot)))
+ (setf (slot-value obj (slot-definition-name pk-slot))
+ (database-last-autoincrement-id database
+ table
+ pk-slot))))
+
+ )
+ pk))))))
(save-slots-for-class
+
;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
;;;; *************************************************************************
;;;; FILE IDENTIFICATION
#:database-list-sequences
#:database-sequence-last
#:database-sequence-exists-p
+ #:database-last-auto-increment-id
#:database-list-attributes
#:database-attribute-type
#:database-type-library-loaded