r1661: field types
authorKevin M. Rosenberg <kevin@rosenberg.net>
Mon, 25 Mar 2002 23:48:46 +0000 (23:48 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Mon, 25 Mar 2002 23:48:46 +0000 (23:48 +0000)
ChangeLog
interfaces/aodbc/aodbc-sql.cl
interfaces/mysql/mysql-sql.cl
interfaces/postgresql-socket/postgresql-socket-api.cl
interfaces/postgresql-socket/postgresql-socket-sql.cl
interfaces/postgresql/postgresql-sql.cl
sql/sql.cl
test-clsql.cl

index ac948b26fef81802de4c5080202d2fc222d30564..6238e59010eb8d0671198670fb1c6c0a54ba58da 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,11 +5,12 @@
        Got :auto types working
 
        * interfaces/postgresql/postgresql-api.cl
+       * interfaces/postgresql-socket/postgresql-socket-api.cl
        Added pgsql-field-types enum
        Got :auto types working
 
-;      * multiple-files
-;      Renamed :field-types to :types
+       * multiple-files
+       Renamed :field-types to :types
        
 24 Mar 2002 Kevin Rosenberg (kevin@rosenberg.net)
 
index e6244d18b3170f9447887b2b658b78157c5c8461..2e83b5a89262bfd0d9dc3a51e5dd9feb8326f371 100644 (file)
@@ -7,7 +7,7 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Feb 2002
 ;;;;
-;;;; $Id: aodbc-sql.cl,v 1.5 2002/03/25 06:07:06 kevin Exp $
+;;;; $Id: aodbc-sql.cl,v 1.6 2002/03/25 23:48:46 kevin Exp $
 ;;;;
 ;;;; This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
 ;;;;
   (setf (database-aodbc-conn database) nil)
   t)
 
-(defmethod database-query (query-expression (database aodbc-database) field-types) 
+(defmethod database-query (query-expression (database aodbc-database) types) 
   (handler-case
       (dbi:sql query-expression :db (database-aodbc-conn database)
-              :types field-types)
+              :types types)
     (error ()
       (error 'clsql-sql-error
             :database database
 
 (defstruct aodbc-result-set
   (query nil)
-  (field-types nil :type cons)
+  (types nil :type cons)
   (full-set nil :type boolean))
 
 (defmethod database-query-result-set (query-expression (database aodbc-database) 
-                                     &key full-set field-types)
+                                     &key full-set types)
   (handler-case 
       (multiple-value-bind (query column-names)
          (dbi:sql query-expression 
                   :row-count nil
                   :column-names t
                   :query t
-                  :types field-types
+                  :types types
                   )
        (values
         (make-aodbc-result-set :query query :full-set full-set 
-                               :field-types field-types)
+                               :types types)
         (length column-names)
         nil ;; not able to return number of rows with aodbc
         ))
index d8b674c8e0aac0d3acb23f01c7d9a875e94f38b7..576438e04f835b0518aeca0f02ab71cab035b112 100644 (file)
@@ -8,7 +8,7 @@
 ;;;;                Original code by Pierre R. Mai 
 ;;;; Date Started:  Feb 2002
 ;;;;
-;;;; $Id: mysql-sql.cl,v 1.9 2002/03/25 14:26:23 kevin Exp $
+;;;; $Id: mysql-sql.cl,v 1.10 2002/03/25 23:48:46 kevin Exp $
 ;;;;
 ;;;; This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
 ;;;; and Copyright (c) 1999-2001 by Pierre R. Mai
@@ -41,7 +41,7 @@
 
 ;;; Field conversion functions
 
-(defun canonicalize-field-types (types num-fields res-ptr)
+(defun canonicalize-types (types num-fields res-ptr)
   (cond
    ((if (listp types)
        (let ((length-types (length types))
 
 
 (defmethod database-query (query-expression (database mysql-database) 
-                          field-types)
+                          types)
   (with-slots (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 field-types (canonicalize-field-types 
-                                     field-types num-fields
+                  (setq types (canonicalize-types 
+                                     types num-fields
                                      res-ptr))
                   (unwind-protect
                        (loop for row = (mysql-fetch-row res-ptr)
 (defstruct mysql-result-set
   (res-ptr (uffi:make-null-pointer 'mysql-mysql-res)
           :type mysql-mysql-res-ptr-def)
-  (field-types nil)
+  (types nil)
   (num-fields nil :type fixnum)
   (full-set nil :type boolean))
 
 
 (defmethod database-query-result-set (query-expression 
                                      (database mysql-database)
-                                     &key full-set field-types)
+                                     &key full-set types)
   (uffi:with-cstring (query-native query-expression)
     (let ((mysql-ptr (database-mysql-ptr database)))
      (declare (type mysql-mysql-ptr-def mysql-ptr))
                                    :res-ptr res-ptr
                                    :num-fields num-fields
                                    :full-set full-set
-                                   :field-types
-                                   (canonicalize-field-types 
-                                    field-types num-fields
+                                   :types
+                                   (canonicalize-types 
+                                    types num-fields
                                     res-ptr)))) 
                  (if full-set
                      (values result-set
 (defmethod database-store-next-row (result-set (database mysql-database) list)
   (let* ((res-ptr (mysql-result-set-res-ptr result-set))
         (row (mysql-fetch-row res-ptr))
-        (field-types (mysql-result-set-field-types result-set)))
+        (types (mysql-result-set-types result-set)))
     (declare (type mysql-mysql-res-ptr-def res-ptr)
             (type mysql-row-def row))
     (unless (uffi:null-pointer-p row)
            (setf (car rest) 
                  (convert-raw-field
                   (uffi:deref-array row 'mysql-row i)
-                  field-types
+                  types
                   i)))
       list)))
 
index e8706805e9236c1f6b7584586af442c0c08ad0b1..c33bb131f1144198cdd6694a183515e5fd95c002 100644 (file)
@@ -9,7 +9,7 @@
 ;;;;                
 ;;;; Date Started:  Feb 2002
 ;;;;
-;;;; $Id: postgresql-socket-api.cl,v 1.4 2002/03/25 23:30:49 kevin Exp $
+;;;; $Id: postgresql-socket-api.cl,v 1.5 2002/03/25 23:48:46 kevin Exp $
 ;;;;
 ;;;; This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
 ;;;; and Copyright (c) 1999-2001 by Pierre R. Mai
@@ -576,7 +576,36 @@ connection, if it is still open."
       (t
        result))))
 
-(defun read-cursor-row (cursor field-types)
+(defun read-field2 (socket type)
+  (let* ((length (read-socket-value 'int32 socket)))
+    (case type
+      (:int
+       (read-integer-from-socket socket length))
+      (:double
+       (read-double-from-socket socket length))
+      (t
+       (let ((result (make-string (- length 4))))
+        (read-socket-sequence result socket)
+        result)))))
+
+(defun read-integer-from-socket (socket length)
+  (let ((val 0)
+       (first-char (read-byte socket))
+       (negative nil))
+    (if (eql first-char (char-code #\-))
+       (setq negative t)
+       (setq val (- first-char (char-code #\0))))
+    (dotimes (i (1- length))
+      (setq val (+
+                (* 10 val)
+                (- (read-byte socket) (char-code #\0)))))
+    (if negative
+       (- 0 val)
+       val)))
+
+           
+
+(defun read-cursor-row (cursor types)
   (let* ((connection (postgresql-cursor-connection cursor))
         (socket (postgresql-connection-socket connection))
         (fields (postgresql-cursor-fields cursor)))
@@ -596,7 +625,7 @@ connection, if it is still open."
                     collect nil
                     else
                     collect
-                    (read-field socket (nth i field-types)))))
+                    (read-field socket (nth i types)))))
            (#.+binary-row-message+
             (error "NYI"))
            (#.+completed-response-message+
@@ -627,7 +656,7 @@ connection, if it is still open."
          (funcall func (elt seq i) i)))
   result-seq)
 
-(defun copy-cursor-row (cursor sequence field-types)
+(defun copy-cursor-row (cursor sequence types)
   (let* ((connection (postgresql-cursor-connection cursor))
         (socket (postgresql-connection-socket connection))
         (fields (postgresql-cursor-fields cursor)))
@@ -644,14 +673,14 @@ connection, if it is still open."
                   (declare (fixnum i))
                   (if (zerop (elt null-vector i))
                       (setf (elt sequence i) nil)
-                      (let ((value (read-field socket (nth i field-types))))
+                      (let ((value (read-field socket (nth i types))))
                         (setf (elt sequence i) value)))))
               (map-into-indexed
                sequence
                #'(lambda (null-bit i)
                    (if (zerop null-bit)
                        nil
-                       (read-field socket (nth i field-types))))
+                       (read-field socket (nth i types))))
                (read-null-bit-vector socket (length sequence)))))
            (#.+binary-row-message+
             (error "NYI"))
@@ -714,12 +743,12 @@ connection, if it is still open."
             (error 'postgresql-fatal-error :connection connection
                    :message "Received garbled message from backend")))))))
 
-(defun run-query (connection query &optional (field-types nil))
+(defun run-query (connection query &optional (types nil))
   (start-query-execution connection query)
   (multiple-value-bind (status cursor)
       (wait-for-query-results connection)
     (assert (eq status :cursor))
-    (loop for row = (read-cursor-row cursor field-types)
+    (loop for row = (read-cursor-row cursor types)
          while row
          collect row
          finally
index 61dddb47492962f794330b0986bd43055c0478c2..e81d9ea8cf2629166d64697bb3e7cd9fd80c43ca 100644 (file)
@@ -8,7 +8,7 @@
 ;;;;                Original code by Pierre R. Mai 
 ;;;; Date Started:  Feb 2002
 ;;;;
-;;;; $Id: postgresql-socket-sql.cl,v 1.5 2002/03/25 23:22:07 kevin Exp $
+;;;; $Id: postgresql-socket-sql.cl,v 1.6 2002/03/25 23:48:46 kevin Exp $
 ;;;;
 ;;;; This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
 ;;;; and Copyright (c) 1999-2001 by Pierre R. Mai
@@ -44,7 +44,7 @@
       (otherwise
        t))))
 
-(defun canonicalize-field-types (types cursor)
+(defun canonicalize-types (types cursor)
   (let* ((fields (postgresql-cursor-fields cursor))
         (num-fields (length fields)))
     (cond
   (close-postgresql-connection (database-connection database))
   t)
 
-(defmethod database-query (expression (database postgresql-socket-database) field-types)
+(defmethod database-query (expression (database postgresql-socket-database) types)
   (let ((connection (database-connection database)))
     (with-postgresql-handlers (database expression)
       (start-query-execution connection expression)
                 :expression expression
                 :errno 'missing-result
                 :error "Didn't receive result cursor for query."))
-       (setq field-types (canonicalize-field-types field-types cursor))
-       (loop for row = (read-cursor-row cursor field-types)
+       (setq types (canonicalize-types types cursor))
+       (loop for row = (read-cursor-row cursor types)
              while row
              collect row
              finally
 (defstruct postgresql-socket-result-set
   (done nil)
   (cursor nil)
-  (field-types nil))
+  (types nil))
 
 (defmethod database-query-result-set (expression (database postgresql-socket-database) 
-                                     &key full-set field-types
+                                     &key full-set types
      )
   (declare (ignore full-set))
   (let ((connection (database-connection database)))
        (values (make-postgresql-socket-result-set
                 :done nil 
                 :cursor cursor
-                :field-types (canonicalize-field-types field-types cursor))
+                :types (canonicalize-types types cursor))
                (length (postgresql-cursor-fields cursor)))))))
 
 (defmethod database-dump-result-set (result-set
     (with-postgresql-handlers (database)
       (if (copy-cursor-row cursor 
                           list
-                          (postgresql-socket-result-set-field-types
+                          (postgresql-socket-result-set-types
                            result-set))
          t
          (prog1 nil
index db4128bf96c4eab0469eda865be9e716a44d029d..ce4641960b753dd5101ea5ee44f5dd2322535554 100644 (file)
@@ -8,7 +8,7 @@
 ;;;;                Original code by Pierre R. Mai 
 ;;;; Date Started:  Feb 2002
 ;;;;
-;;;; $Id: postgresql-sql.cl,v 1.8 2002/03/25 14:13:41 kevin Exp $
+;;;; $Id: postgresql-sql.cl,v 1.9 2002/03/25 23:48:46 kevin Exp $
 ;;;;
 ;;;; This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
 ;;;; and Copyright (c) 1999-2001 by Pierre R. Mai
@@ -30,7 +30,7 @@
 
 ;;; Field conversion functions
 
-(defun canonicalize-field-types (types num-fields res-ptr)
+(defun canonicalize-types (types num-fields res-ptr)
   (cond
    ((if (listp types)
        (let ((length-types (length types))
   (setf (database-conn-ptr database) nil)
   t)
 
-(defmethod database-query (query-expression (database postgresql-database) field-types)
+(defmethod database-query (query-expression (database postgresql-database) types)
   (let ((conn-ptr (database-conn-ptr database)))
     (declare (type pgsql-conn-def conn-ptr))
     (uffi:with-cstring (query-native query-expression)
                nil)
               (#.pgsql-exec-status-type#tuples-ok
               (let ((num-fields (PQnfields result)))
-                (setq field-types
-                  (canonicalize-field-types field-types num-fields
+                (setq types
+                  (canonicalize-types types num-fields
                                             result))
                 (loop for tuple-index from 0 below (PQntuples result)
                       collect
                             (if (zerop (PQgetisnull result tuple-index i))
                                 (convert-raw-field
                                  (PQgetvalue result tuple-index i)
-                                 field-types i)
+                                 types i)
                                 nil)))))
               (t
                (error 'clsql-sql-error
 (defstruct postgresql-result-set
   (res-ptr (uffi:make-null-pointer 'pgsql-result) 
           :type pgsql-result-def)
-  (field-types nil) 
+  (types nil) 
   (num-tuples 0 :type integer)
   (num-fields 0 :type integer)
   (tuple-index 0 :type integer))
 
 (defmethod database-query-result-set (query-expression (database postgresql-database) 
-                                      &key full-set field-types)
+                                      &key full-set types)
   (let ((conn-ptr (database-conn-ptr database)))
     (declare (type pgsql-conn-def conn-ptr))
     (uffi:with-cstring (query-native query-expression)
                         :res-ptr result
                         :num-fields (PQnfields result)
                         :num-tuples (PQntuples result)
-                       :field-types (canonicalize-field-types 
-                                     field-types
+                       :types (canonicalize-types 
+                                     types
                                      (PQnfields result)
                                      result))))
             (if full-set
 (defmethod database-store-next-row (result-set (database postgresql-database) 
                                     list)
   (let ((result (postgresql-result-set-res-ptr result-set))
-       (field-types (postgresql-result-set-field-types result-set)))
+       (types (postgresql-result-set-types result-set)))
     (declare (type pgsql-result-def result))
     (if (>= (postgresql-result-set-tuple-index result-set)
            (postgresql-result-set-num-tuples result-set))
               (if (zerop (PQgetisnull result tuple-index i))
                   (convert-raw-field
                    (PQgetvalue result tuple-index i)
-                  field-types i)
+                  types i)
                 nil))
           finally
             (incf (postgresql-result-set-tuple-index result-set))
index 1c02d6651f93482b082de77af99cdfb7762c341c..ea1d73217b2482824b3a07a1f008a86eca9d6115 100644 (file)
@@ -8,7 +8,7 @@
 ;;;;                 Original code by Pierre R. Mai 
 ;;;; Date Started:  Feb 2002
 ;;;;
-;;;; $Id: sql.cl,v 1.5 2002/03/24 22:25:51 kevin Exp $
+;;;; $Id: sql.cl,v 1.6 2002/03/25 23:48:46 kevin Exp $
 ;;;;
 ;;;; This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
 ;;;; and Copyright (c) 1999-2001 by Pierre R. Mai
@@ -309,14 +309,14 @@ database was disconnected and only one other connection exists."
 ;;; Basic operations on databases
 
 (defmethod query (query-expression &key (database *default-database*)  
-                 field-types)
+                 types)
   "Execute the SQL query expression query-expression on the given database.
 Returns a list of lists of values of the result of that expression."
-  (database-query query-expression database field-types))
+  (database-query query-expression database types))
 
-(defgeneric database-query (query-expression database field-types)
-  (:method (query-expression (database closed-database) field-types)
-          (declare (ignore query-expression field-types))
+(defgeneric database-query (query-expression database types)
+  (:method (query-expression (database closed-database) types)
+          (declare (ignore query-expression types))
           (signal-closed-database-error database))
   (:documentation "Internal generic implementation of query."))
 
@@ -333,9 +333,9 @@ Returns true on success or nil on failure."
 
 ;;; Mapping and iteration
 (defgeneric database-query-result-set
-    (query-expression database &key full-set field-types)
-  (:method (query-expression (database closed-database) &key full-set field-types)
-          (declare (ignore query-expression full-set field-types))
+    (query-expression database &key full-set types)
+  (:method (query-expression (database closed-database) &key full-set types)
+          (declare (ignore query-expression full-set types))
           (signal-closed-database-error database)
           (values nil nil nil))
   (:documentation
@@ -371,7 +371,7 @@ returns nil when result-set is finished."))
 
 (defun map-query (output-type-spec function query-expression
                  &key (database *default-database*)
-                 (field-types nil))
+                 (types nil))
   "Map the function over all tuples that are returned by the query in
 query-expression.  The results of the function are collected as
 specified in output-type-spec and returned like in MAP."
@@ -383,21 +383,21 @@ specified in output-type-spec and returned like in MAP."
               `(if (atom ,type) ,type (car ,type))))
     (case (type-specifier-atom output-type-spec)
       ((nil) 
-       (map-query-for-effect function query-expression database field-types))
+       (map-query-for-effect function query-expression database types))
       (list 
-       (map-query-to-list function query-expression database field-types))
+       (map-query-to-list function query-expression database types))
       ((simple-vector simple-string vector string array simple-array
        bit-vector simple-bit-vector base-string
        simple-base-string)
-       (map-query-to-simple output-type-spec function query-expression database field-types))
+       (map-query-to-simple output-type-spec function query-expression database types))
       (t
        (funcall #'map-query (cmucl-compat:result-type-or-lose output-type-spec t)
-              function query-expression :database database :field-types field-types)))))
+              function query-expression :database database :types types)))))
 
-(defun map-query-for-effect (function query-expression database field-types)
+(defun map-query-for-effect (function query-expression database types)
   (multiple-value-bind (result-set columns)
       (database-query-result-set query-expression database :full-set nil
-                                :field-types field-types)
+                                :types types)
     (when result-set
       (unwind-protect
           (do ((row (make-list columns)))
@@ -406,10 +406,10 @@ specified in output-type-spec and returned like in MAP."
             (apply function row))
        (database-dump-result-set result-set database)))))
                     
-(defun map-query-to-list (function query-expression database field-types)
+(defun map-query-to-list (function query-expression database types)
   (multiple-value-bind (result-set columns)
       (database-query-result-set query-expression database :full-set nil
-                                :field-types field-types)
+                                :types types)
     (when result-set
       (unwind-protect
           (let ((result (list nil)))
@@ -421,10 +421,10 @@ specified in output-type-spec and returned like in MAP."
        (database-dump-result-set result-set database)))))
 
 
-(defun map-query-to-simple (output-type-spec function query-expression database field-types)
+(defun map-query-to-simple (output-type-spec function query-expression database types)
   (multiple-value-bind (result-set columns rows)
       (database-query-result-set query-expression database :full-set t
-                                :field-types field-types)
+                                :types types)
     (when result-set
       (unwind-protect
           (if rows
@@ -457,7 +457,7 @@ specified in output-type-spec and returned like in MAP."
 
 (defmacro do-query (((&rest args) query-expression
                     &key (database '*default-database*)
-                    (field-types nil))
+                    (types nil))
                    &body body)
   (let ((result-set (gensym))
        (columns (gensym))
@@ -466,7 +466,7 @@ specified in output-type-spec and returned like in MAP."
     `(let ((,db ,database))
        (multiple-value-bind (,result-set ,columns)
           (database-query-result-set ,query-expression ,db
-                                     :full-set nil :field-types ,field-types)
+                                     :full-set nil :types ,types)
         (when ,result-set
           (unwind-protect
                (do ((,row (make-list ,columns)))
index 78f83dec239c802cce1349da682f79fa5c7c198d..0507e140ec472007e204a1c0b53fbc7b00b649d1 100644 (file)
@@ -7,7 +7,7 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Mar 2002
 ;;;;
-;;;; $Id: test-clsql.cl,v 1.7 2002/03/25 23:22:07 kevin Exp $
+;;;; $Id: test-clsql.cl,v 1.8 2002/03/25 23:48:46 kevin Exp $
 ;;;;
 ;;;; This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
 ;;;;
          (create-test-table db)
          (pprint (clsql:query "select * from test_clsql" 
                               :database db
-                              :field-types :auto))
+                              :types :auto))
          (pprint (clsql:map-query 'vector #'list "select * from test_clsql" 
                                   :database db
-                                  :field-types :auto)) ;;'(:int :double t)))
+                                  :types :auto)) ;;'(:int :double t)))
          (drop-test-table db))
       (clsql:disconnect :database db)))
   )
@@ -96,7 +96,7 @@
        (format nil "INSERT INTO test_clsql VALUES (~d,~d,'~a')"
               i (sqrt i) (format nil "~d" (sqrt i)))
        db))
-    (let ((res (clsql-mysql::database-query-result-set "select * from test_clsql" db :full-set t :field-types nil)))
+    (let ((res (clsql-mysql::database-query-result-set "select * from test_clsql" db :full-set t :types nil)))
       (format t "~&Number rows: ~D~%" (mysql:mysql-num-rows (clsql-mysql::mysql-result-set-res-ptr res)))
       (clsql-mysql::database-dump-result-set res db))
     (clsql-mysql::database-execute-command "DROP TABLE test_clsql" db)