X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=db-mysql%2Fmysql-sql.lisp;h=2945258de5f292f1f668a278a7f446e038d78d91;hb=6aea6351029abb9a0e82bb71479bac27e0f50dff;hp=39bee7ef0c5ed25a97c44a213bef67d625086eb1;hpb=44c87a075cbe29141d90dc49c501f382a6d81fbe;p=clsql.git diff --git a/db-mysql/mysql-sql.lisp b/db-mysql/mysql-sql.lisp index 39bee7e..2945258 100644 --- a/db-mysql/mysql-sql.lisp +++ b/db-mysql/mysql-sql.lisp @@ -41,16 +41,25 @@ (dotimes (i num-fields) (declare (fixnum i)) (let* ((field (uffi:deref-array field-vec '(:array mysql-field) i)) - (type (uffi:get-slot-value field 'mysql-field 'type))) + (flags (uffi:get-slot-value field 'mysql-field 'mysql::flags)) + (unsigned (plusp (logand flags 32))) + (type (uffi:get-slot-value field 'mysql-field 'type))) (push (case type ((#.mysql-field-types#tiny #.mysql-field-types#short - #.mysql-field-types#int24 - #.mysql-field-types#long) - :int32) - (#.mysql-field-types#longlong - :int64) + #.mysql-field-types#int24) + (if unsigned + :uint32 + :int32)) + (#.mysql-field-types#long + (if unsigned + :uint + :int)) + (#.mysql-field-types#longlong + (if unsigned + :uint64 + :int64)) ((#.mysql-field-types#double #.mysql-field-types#float #.mysql-field-types#decimal) @@ -387,7 +396,11 @@ (mysql:mysql-insert-id (clsql-mysql::database-mysql-ptr database)))) (defmethod database-sequence-last (sequence-name (database mysql-database)) - (declare (ignore sequence-name))) + (without-interrupts + (caar (database-query + (concatenate 'string "SELECT id from " + (%sequence-name-to-table sequence-name)) + database :auto nil)))) (defmethod database-create (connection-spec (type (eql :mysql))) (destructuring-bind (host name user password) connection-spec @@ -505,9 +518,9 @@ (print 'a) (dotimes (i (length types)) (let* ((binding (uffi:deref-array input-bind '(:array mysql-bind) i))) - (setf (uffi:get-slot-value binding 'mysql-bind 'buffer-type) + (setf (uffi:get-slot-value binding 'mysql-bind 'mysql::buffer-type) (nth i mysql-types)) - (setf (uffi:get-slot-value binding 'mysql-bind 'buffer-length) 0))) + (setf (uffi:get-slot-value binding 'mysql-bind 'mysql::buffer-length) 0))) (print 'b) (unless (uffi:null-pointer-p rs) @@ -521,11 +534,13 @@ (let* ((field (uffi:deref-array field-vec '(:array mysql-field) i)) (type (uffi:get-slot-value field 'mysql-field 'type)) (binding (uffi:deref-array output-bind '(:array mysql-bind) i))) - (setf (uffi:get-slot-value binding 'mysql-bind 'buffer-type) type) + (setf (uffi:get-slot-value binding 'mysql-bind 'mysql::buffer-type) type) - (setf (uffi:get-slot-value binding 'mysql-bind 'buffer-length) 0) - (setf (uffi:get-slot-value binding 'mysql-bind 'is-null) + (setf (uffi:get-slot-value binding 'mysql-bind 'mysql::buffer-length) 0) + #+need-to-allocate-foreign-object-for-this + (setf (uffi:get-slot-value binding 'mysql-bind 'mysql::is-null) (+ i (uffi:pointer-address is-null-ptr))) + #+need-to-allocate-foreign-object-for-this (setf (uffi:get-slot-value binding 'mysql-bind 'length) (+ (* i 8) (uffi:pointer-address length-ptr))) @@ -533,28 +548,28 @@ ((#.mysql-field-types#var-string #.mysql-field-types#string #.mysql-field-types#tiny-blob #.mysql-field-types#blob #.mysql-field-types#medium-blob #.mysql-field-types#long-blob) - (setf (uffi:get-slot-value binding 'mysql-bind 'buffer-length) 1024) - (setf (uffi:get-slot-value binding 'mysql-bind 'buffer) + (setf (uffi:get-slot-value binding 'mysql-bind 'mysql::buffer-length) 1024) + (setf (uffi:get-slot-value binding 'mysql-bind 'mysql::buffer) (uffi:allocate-foreign-object :unsigned-char 1024))) (#.mysql-field-types#tiny - (setf (uffi:get-slot-value binding 'mysql-bind 'buffer) + (setf (uffi:get-slot-value binding 'mysql-bind 'mysql::buffer) (uffi:allocate-foreign-object :byte))) (#.mysql-field-types#short - (setf (uffi:get-slot-value binding 'mysql-bind 'buffer) + (setf (uffi:get-slot-value binding 'mysql-bind 'mysql::buffer) (uffi:allocate-foreign-object :short))) (#.mysql-field-types#long - (setf (uffi:get-slot-value binding 'mysql-bind 'buffer) + (setf (uffi:get-slot-value binding 'mysql-bind 'mysql::buffer) ;; segfaults if supply :int on amd64 (uffi:allocate-foreign-object :long))) #+64bit (#.mysql-field-types#longlong - (setf (uffi:get-slot-value binding 'mysql-bind 'buffer) + (setf (uffi:get-slot-value binding 'mysql-bind 'mysql::buffer) (uffi:allocate-foreign-object :long))) (#.mysql-field-types#float - (setf (uffi:get-slot-value binding 'mysql-bind 'buffer) + (setf (uffi:get-slot-value binding 'mysql-bind 'mysql::buffer) (uffi:allocate-foreign-object :float))) (#.mysql-field-types#double - (setf (uffi:get-slot-value binding 'mysql-bind 'buffer) + (setf (uffi:get-slot-value binding 'mysql-bind 'mysql::buffer) (uffi:allocate-foreign-object :double))) ((#.mysql-field-types#time #.mysql-field-types#date #.mysql-field-types#datetime #.mysql-field-types#timestamp) @@ -598,7 +613,7 @@ (setf (uffi:deref-array (is-null-ptr stmt) '(:array :byte) (1- position)) 0)) (case type (#.mysql-field-types#long - (setf (uffi:get-slot-value binding 'mysql-bind 'buffer) value)) + (setf (uffi:get-slot-value binding 'mysql-bind 'mysql::buffer) value)) (t (warn "Unknown input bind type ~D." type)) ))))) @@ -640,8 +655,8 @@ (uffi:deref-array (is-null-ptr stmt) '(:array :byte) i)))))) (unless is-null (let* ((bind (uffi:deref-array (output-bind stmt) '(:array mysql-bind) i)) - (type (uffi:get-slot-value bind 'mysql-bind 'buffer-type)) - (buffer (uffi:get-slot-value bind 'mysql-bind 'buffer))) + (type (uffi:get-slot-value bind 'mysql-bind 'mysql::buffer-type)) + (buffer (uffi:get-slot-value bind 'mysql-bind 'mysql::buffer))) (case type ((#.mysql-field-types#var-string #.mysql-field-types#string #.mysql-field-types#tiny-blob #.mysql-field-types#blob