From 21a11d58a1d421db0c53a063178dd2bc02663a15 Mon Sep 17 00:00:00 2001 From: "Kevin M. Rosenberg" Date: Mon, 25 Mar 2002 23:48:46 +0000 Subject: [PATCH] r1661: field types --- ChangeLog | 5 ++- interfaces/aodbc/aodbc-sql.cl | 14 +++--- interfaces/mysql/mysql-sql.cl | 24 +++++----- .../postgresql-socket-api.cl | 45 +++++++++++++++---- .../postgresql-socket-sql.cl | 18 ++++---- interfaces/postgresql/postgresql-sql.cl | 24 +++++----- sql/sql.cl | 44 +++++++++--------- test-clsql.cl | 8 ++-- 8 files changed, 106 insertions(+), 76 deletions(-) diff --git a/ChangeLog b/ChangeLog index ac948b2..6238e59 100644 --- 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) diff --git a/interfaces/aodbc/aodbc-sql.cl b/interfaces/aodbc/aodbc-sql.cl index e6244d1..2e83b5a 100644 --- a/interfaces/aodbc/aodbc-sql.cl +++ b/interfaces/aodbc/aodbc-sql.cl @@ -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 ;;;; @@ -60,10 +60,10 @@ (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 @@ -84,11 +84,11 @@ (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 @@ -96,11 +96,11 @@ :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 )) diff --git a/interfaces/mysql/mysql-sql.cl b/interfaces/mysql/mysql-sql.cl index d8b674c..576438e 100644 --- a/interfaces/mysql/mysql-sql.cl +++ b/interfaces/mysql/mysql-sql.cl @@ -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)) @@ -171,15 +171,15 @@ (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) @@ -216,14 +216,14 @@ (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)) @@ -238,9 +238,9 @@ :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 @@ -268,7 +268,7 @@ (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) @@ -278,7 +278,7 @@ (setf (car rest) (convert-raw-field (uffi:deref-array row 'mysql-row i) - field-types + types i))) list))) diff --git a/interfaces/postgresql-socket/postgresql-socket-api.cl b/interfaces/postgresql-socket/postgresql-socket-api.cl index e870680..c33bb13 100644 --- a/interfaces/postgresql-socket/postgresql-socket-api.cl +++ b/interfaces/postgresql-socket/postgresql-socket-api.cl @@ -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 diff --git a/interfaces/postgresql-socket/postgresql-socket-sql.cl b/interfaces/postgresql-socket/postgresql-socket-sql.cl index 61dddb4..e81d9ea 100644 --- a/interfaces/postgresql-socket/postgresql-socket-sql.cl +++ b/interfaces/postgresql-socket/postgresql-socket-sql.cl @@ -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 @@ -153,7 +153,7 @@ (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) @@ -166,8 +166,8 @@ :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 @@ -216,10 +216,10 @@ (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))) @@ -237,7 +237,7 @@ (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 @@ -256,7 +256,7 @@ (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 diff --git a/interfaces/postgresql/postgresql-sql.cl b/interfaces/postgresql/postgresql-sql.cl index db4128b..ce46419 100644 --- a/interfaces/postgresql/postgresql-sql.cl +++ b/interfaces/postgresql/postgresql-sql.cl @@ -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)) @@ -166,7 +166,7 @@ (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) @@ -183,8 +183,8 @@ 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 @@ -193,7 +193,7 @@ (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 @@ -236,13 +236,13 @@ (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) @@ -260,8 +260,8 @@ :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 @@ -289,7 +289,7 @@ (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)) @@ -302,7 +302,7 @@ (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)) diff --git a/sql/sql.cl b/sql/sql.cl index 1c02d66..ea1d732 100644 --- a/sql/sql.cl +++ b/sql/sql.cl @@ -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))) diff --git a/test-clsql.cl b/test-clsql.cl index 78f83de..0507e14 100644 --- a/test-clsql.cl +++ b/test-clsql.cl @@ -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 ;;;; @@ -78,10 +78,10 @@ (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) -- 2.34.1