r7061: initial property settings
[clsql.git] / db-mysql / mysql-sql.lisp
index 4011692b396c2da2fb91e238574998adb0a72bed..e933498616733cf8545395f37ff3b5cf106074a2 100644 (file)
@@ -2,13 +2,13 @@
 ;;;; *************************************************************************
 ;;;; FILE IDENTIFICATION
 ;;;;
-;;;; Name:          mysql-sql.cl
+;;;; Name:          mysql-sql.lisp
 ;;;; Purpose:       High-level MySQL interface using UFFI
 ;;;; Programmers:   Kevin M. Rosenberg based on
 ;;;;                Original code by Pierre R. Mai 
 ;;;; Date Started:  Feb 2002
 ;;;;
-;;;; $Id: mysql-sql.lisp,v 1.2 2002/10/14 04:09:02 kevin Exp $
+;;;; $Id$
 ;;;;
 ;;;; This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
 ;;;; and Copyright (c) 1999-2001 by Pierre R. Mai
@@ -18,7 +18,8 @@
 ;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
 ;;;; *************************************************************************
 
-(declaim (optimize (debug 3) (speed 3) (safety 1) (compilation-speed 0)))
+(eval-when (:compile-toplevel)
+  (declaim (optimize (debug 3) (speed 3) (safety 1) (compilation-speed 0))))
 
 ;;;; Modified by Kevin Rosenberg, Feb 20002
 ;;;; -- Added support for Allegro CL and Lispworks using UFFI layer
 ;;;; Mar 2002
 ;;;; Added field types
 
-(defpackage :clsql-mysql
+(defpackage #:clsql-mysql
     (:use #:common-lisp #:clsql-base-sys #:mysql #:clsql-uffi)
     (:export #:mysql-database)
     (:documentation "This is the CLSQL interface to MySQL."))
 
-(in-package :clsql-mysql)
+(in-package #:clsql-mysql)
 
 ;;; Field conversion functions
 
 (defun make-type-list-for-auto (num-fields res-ptr)
+  (declare (fixnum num-fields))
   (let ((new-types '())
        #+ignore (field-vec (mysql-fetch-fields res-ptr)))
     (dotimes (i num-fields)
     (nreverse new-types)))
 
 (defun canonicalize-types (types num-fields res-ptr)
-  (if (null types)
-      nil
-      (let ((auto-list (make-type-list-for-auto num-fields res-ptr)))
-       (cond
-         ((listp types)
-          (canonicalize-type-list types auto-list))
-         ((eq types :auto)
-          auto-list)
-         (t
-          nil)))))
+  (when types
+    (let ((auto-list (make-type-list-for-auto num-fields res-ptr)))
+      (cond
+       ((listp types)
+        (canonicalize-type-list types auto-list))
+       ((eq types :auto)
+        auto-list)
+       (t
+        nil)))))
 
 (defmethod database-initialize-database-type ((database-type (eql :mysql)))
   t)
 
 (defmethod database-query (query-expression (database mysql-database) 
                           types)
-  (with-slots (mysql-ptr) database
+  (declare (optimize (speed 3) (safety 0) (debug 0) (space 0)))
+  (let ((mysql-ptr (database-mysql-ptr database)))
     (uffi:with-cstring (query-native query-expression)
-       (if (zerop (mysql-query mysql-ptr query-native))
-          (let ((res-ptr (mysql-use-result mysql-ptr)))
-            (if res-ptr
-                (let ((num-fields (mysql-num-fields res-ptr)))
-                  (setq types (canonicalize-types 
-                                     types num-fields
-                                     res-ptr))
-                  (unwind-protect
+      (if (zerop (mysql-query mysql-ptr query-native))
+         (let ((res-ptr (mysql-use-result mysql-ptr)))
+           (if res-ptr
+               (unwind-protect
+                    (let ((num-fields (mysql-num-fields res-ptr)))
+                      (declare (fixnum num-fields))
+                      (setq types (canonicalize-types 
+                                   types num-fields
+                                   res-ptr))
+                      (loop for row = (mysql-fetch-row res-ptr)
+                            until (uffi:null-pointer-p row)
+                          collect
+                            (do* ((rlist (make-list num-fields))
+                                  (i 0 (1+ i))
+                                  (pos rlist (cdr pos)))
+                                ((= i num-fields) rlist)
+                              (declare (fixnum i))
+                              (setf (car pos)  
+                                (convert-raw-field
+                                 (uffi:deref-array row '(:array
+                                                         (* :unsigned-char))
+                                                   i)
+                                 types i)))))
+                 (mysql-free-result res-ptr))
+               (error 'clsql-sql-error
+                      :database database
+                      :expression query-expression
+                      :errno (mysql-errno mysql-ptr)
+                      :error (mysql-error-string mysql-ptr))))
+         (error 'clsql-sql-error
+                :database database
+                :expression query-expression
+                :errno (mysql-errno mysql-ptr)
+                :error (mysql-error-string mysql-ptr))))))
+
+#+ignore
+(defmethod database-query (query-expression (database mysql-database) 
+                          types)
+  (declare (optimize (speed 3) (safety 0) (debug 0) (space 0)))
+  (let ((mysql-ptr (database-mysql-ptr database)))
+    (uffi:with-cstring (query-native query-expression)
+      (if (zerop (mysql-query mysql-ptr query-native))
+         (let ((res-ptr (mysql-use-result mysql-ptr)))
+           (if res-ptr
+               (unwind-protect
+                    (let ((num-fields (mysql-num-fields res-ptr)))
+                      (declare (fixnum num-fields))
+                      (setq types (canonicalize-types 
+                                   types num-fields
+                                   res-ptr))
                       (loop for row = (mysql-fetch-row res-ptr)
-                             until (uffi:null-pointer-p row)
-                             collect
-                             (loop for i from 0 below num-fields
-                                   collect
-                                   (convert-raw-field
-                                    (uffi:deref-array row '(:array (* :unsigned-char)) i)
-                                    types i)))
-                    (mysql-free-result res-ptr)))
-              (error 'clsql-sql-error
-                     :database database
-                     :expression query-expression
-                     :errno (mysql-errno mysql-ptr)
-                     :error (mysql-error-string mysql-ptr))))
-        (error 'clsql-sql-error
-               :database database
-               :expression query-expression
-               :errno (mysql-errno mysql-ptr)
-               :error (mysql-error-string mysql-ptr))))))
+                            until (uffi:null-pointer-p row)
+                            collect
+                            (loop for i fixnum from 0 below num-fields
+                                  collect
+                                  (convert-raw-field
+                                   (uffi:deref-array row '(:array
+                                                           (* :unsigned-char))
+                                                     i)
+                                   types i))))
+                 (mysql-free-result res-ptr))
+               (error 'clsql-sql-error
+                      :database database
+                      :expression query-expression
+                      :errno (mysql-errno mysql-ptr)
+                      :error (mysql-error-string mysql-ptr))))
+         (error 'clsql-sql-error
+                :database database
+                :expression query-expression
+                :errno (mysql-errno mysql-ptr)
+                :error (mysql-error-string mysql-ptr))))))
 
 (defmethod database-execute-command (sql-expression (database mysql-database))
   (uffi:with-cstring (sql-native sql-expression)
               :errno (mysql-errno mysql-ptr)
               :error (mysql-error-string mysql-ptr))))))
 
-(defstruct mysql-result-set
-  (res-ptr (uffi:make-null-pointer 'mysql-mysql-res)
-          :type mysql-mysql-res-ptr-def)
-  (types nil)
-  (num-fields nil :type fixnum)
+
+(defstruct mysql-result-set 
+  (res-ptr (uffi:make-null-pointer 'mysql-mysql-res) :type mysql-mysql-res-ptr-def)
+  (types nil :type list)
+  (num-fields 0 :type fixnum)
   (full-set nil :type boolean))
 
 
 
 
 (when (clsql-base-sys:database-type-library-loaded :mysql)
-  (clsql-base-sys:initialize-database-type :database-type :mysql)
-  (pushnew :mysql cl:*features*))
+  (clsql-base-sys:initialize-database-type :database-type :mysql))