;;;; Original code by Pierre R. Mai
;;;; Date Started: Feb 2002
;;;;
-;;;; $Id: postgresql-sql.cl,v 1.1 2002/03/23 14:04:53 kevin Exp $
+;;;; $Id: postgresql-sql.cl,v 1.6 2002/03/24 22:25:51 kevin Exp $
;;;;
;;;; This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
;;;; and Copyright (c) 1999-2001 by Pierre R. Mai
(host db user password &optional port options tty))
(destructuring-bind (host db user password &optional port options tty)
connection-spec
- (uffi:with-cstring (host-native host)
- (uffi:with-cstring (user-native user)
- (uffi:with-cstring (password-native password)
- (uffi:with-cstring (db-native db)
- (uffi:with-cstring (port-native port)
- (uffi:with-cstring (options-native options)
- (uffi:with-cstring (tty-native tty)
- (let ((connection (PQsetdbLogin host-native port-native
- options-native tty-native
- db-native user-native
- password-native)))
- (declare (type pgsql-conn-def connection))
- (when (not (eq (PQstatus connection)
- pgsql-conn-status-type#connection-ok))
- (error 'clsql-connect-error
- :database-type database-type
- :connection-spec connection-spec
- :errno (PQstatus connection)
- :error (tidy-error-message
- (PQerrorMessage connection))))
- (make-instance 'postgresql-database
- :name (database-name-from-spec connection-spec
- database-type)
- :conn-ptr connection)))))))))))
+ (uffi:with-cstrings ((host-native host)
+ (user-native user)
+ (password-native password)
+ (db-native db)
+ (port-native port)
+ (options-native options)
+ (tty-native tty))
+ (let ((connection (PQsetdbLogin host-native port-native
+ options-native tty-native
+ db-native user-native
+ password-native)))
+ (declare (type pgsql-conn-def connection))
+ (when (not (eq (PQstatus connection)
+ pgsql-conn-status-type#connection-ok))
+ (error 'clsql-connect-error
+ :database-type database-type
+ :connection-spec connection-spec
+ :errno (PQstatus connection)
+ :error (tidy-error-message
+ (PQerrorMessage connection))))
+ (make-instance 'postgresql-database
+ :name (database-name-from-spec connection-spec
+ database-type)
+ :conn-ptr connection)))))
(defmethod database-disconnect ((database postgresql-database))
(setf (database-conn-ptr database) nil)
t)
-(defmethod database-query (query-expression (database postgresql-database))
+(defmethod database-query (query-expression (database postgresql-database) field-types)
(let ((conn-ptr (database-conn-ptr database)))
(declare (type pgsql-conn-def conn-ptr))
(uffi:with-cstring (query-native query-expression)
(loop for i from 0 below (PQnfields result)
collect
(if (zerop (PQgetisnull result tuple-index i))
- (uffi:convert-from-cstring
+ (uffi:convert-from-foreign-string
(PQgetvalue result tuple-index i))
nil))))
(t
(defstruct postgresql-result-set
(res-ptr (uffi:make-null-pointer 'pgsql-result)
:type pgsql-result-def)
- (num-tuples 0)
- (num-fields 0)
- (tuple-index 0))
+ (field-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)
- &optional full-set)
+(defmethod database-query-result-set (query-expression (database postgresql-database)
+ &key full-set field-types)
(let ((conn-ptr (database-conn-ptr database)))
(declare (type pgsql-conn-def conn-ptr))
(uffi:with-cstring (query-native query-expression)
(values (make-postgresql-result-set
:res-ptr result
:num-fields (PQnfields result)
- :num-tuples (PQntuples result))
+ :num-tuples (PQntuples result)
+ :field-types field-types)
(PQnfields result)
(PQntuples result))
(values (make-postgresql-result-set
:res-ptr result
:num-fields (PQnfields result)
- :num-tuples (PQntuples result))
+ :num-tuples (PQntuples result)
+ :field-types field-types)
(PQnfields result))))
(t
(unwind-protect
do
(setf (car rest)
(if (zerop (PQgetisnull result tuple-index i))
- (uffi:convert-from-cstring
+ (uffi:convert-from-foreign-string
(PQgetvalue result tuple-index i))
nil))
finally