;;;; Original code by Pierre R. Mai
;;;; Date Started: Feb 2002
;;;;
-;;;; $Id: postgresql-socket-sql.cl,v 1.6 2002/03/25 23:48:46 kevin Exp $
+;;;; $Id: postgresql-socket-sql.cl,v 1.12 2002/05/13 22:05:21 kevin Exp $
;;;;
;;;; This file, part of CLSQL, is Copyright (c) 2002 by Kevin M. Rosenberg
;;;; and Copyright (c) 1999-2001 by Pierre R. Mai
(in-package :clsql-postgresql-socket)
+;; interface foreign library loading routines
+
+(defmethod database-type-library-loaded ((database-type (eql :postgresql-socket)))
+ t)
+
+(defmethod clsql-sys:database-type-load-foreign ((database-type (eql :postgresql-socket)))
+ t)
+
+(clsql-sys:database-type-load-foreign :postgresql-socket)
+
+
;; Field type conversion
+(defun make-type-list-for-auto (cursor)
+ (let* ((fields (postgresql-cursor-fields cursor))
+ (num-fields (length fields))
+ (new-types '()))
+ (dotimes (i num-fields)
+ (declare (fixnum i))
+ (push (canonical-field-type fields i) new-types))
+ (nreverse new-types)))
+
(defun canonical-field-type (fields index)
"Extracts canonical field type from fields list"
(let ((oid (cadr (nth index fields))))
((#.pgsql-ftype#bytea
#.pgsql-ftype#int2
#.pgsql-ftype#int4)
- :int)
+ :int32)
+ (#.pgsql-ftype#int8
+ :int64)
((#.pgsql-ftype#float4
#.pgsql-ftype#float8)
:double)
t))))
(defun canonicalize-types (types cursor)
- (let* ((fields (postgresql-cursor-fields cursor))
- (num-fields (length fields)))
- (cond
- ((listp types)
- (let ((length-types (length types))
- (new-types '()))
- (loop for i from 0 below num-fields
- do
- (if (>= i length-types)
- (push t new-types) ;; types is shorted than num-fields
- (push
- (case (nth i types)
- ((:int :long :double t)
- (nth i types))
- (t
- t))
- new-types)))
- (nreverse new-types)))
- ((eq types :auto)
- (let ((new-types '()))
- (dotimes (i num-fields)
- (declare (fixnum i))
- (push (canonical-field-type fields i) new-types))
- (nreverse new-types)))
- (t
- nil))))
+ (if (null types)
+ nil
+ (let ((auto-list (make-type-list-for-auto cursor)))
+ (cond
+ ((listp types)
+ (canonicalize-type-list types auto-list))
+ ((eq types :auto)
+ auto-list)
+ (t
+ nil)))))
+
+(defun canonicalize-type-list (types auto-list)
+ "Ensure a field type list meets expectations.
+Duplicated from clsql-uffi package so that this interface
+doesn't depend on UFFI."
+ (let ((length-types (length types))
+ (new-types '()))
+ (loop for i from 0 below (length auto-list)
+ do
+ (if (>= i length-types)
+ (push t new-types) ;; types is shorted than num-fields
+ (push
+ (case (nth i types)
+ (:int
+ (case (nth i auto-list)
+ (:int32
+ :int32)
+ (:int64
+ :int64)
+ (t
+ t)))
+ (:double
+ (case (nth i auto-list)
+ (:double
+ :double)
+ (t
+ t)))
+ (t
+ t))
+ new-types)))
+ (nreverse new-types)))
+
(defun convert-to-clsql-warning (database condition)
(warn 'clsql-database-warning :database database
;; KMR - removed double @@
,@body))))
-(defmethod database-initialize-database-type
- ((database-type (eql :postgresql-socket)))
+(defmethod database-initialize-database-type ((database-type
+ (eql :postgresql-socket)))
t)
(defclass postgresql-socket-database (database)
((connection :accessor database-connection :initarg :connection
:type postgresql-connection)))
-(defmethod database-name-from-spec
- (connection-spec (database-type (eql :postgresql-socket)))
+(defmethod database-type ((database postgresql-socket-database))
+ :postgresql-socket)
+
+(defmethod database-name-from-spec (connection-spec
+ (database-type (eql :postgresql-socket)))
(check-connection-spec connection-spec database-type
(host db user password &optional port options tty))
(destructuring-bind (host db user password &optional port options tty)
(declare (ignore password options tty))
(concatenate 'string host (if port ":") (if port port) "/" db "/" user)))
-(defmethod database-connect
- (connection-spec (database-type (eql :postgresql-socket)))
+(defmethod database-connect (connection-spec
+ (database-type (eql :postgresql-socket)))
(check-connection-spec connection-spec database-type
(host db user password &optional port options tty))
(destructuring-bind (host db user password &optional
(make-instance 'postgresql-socket-database
:name (database-name-from-spec connection-spec
database-type)
+ :connection-spec connection-spec
:connection connection))
(postgresql-error (c)
;; Connect failed
(prog1 nil
(setf (postgresql-socket-result-set-done result-set) t)
(wait-for-query-results (database-connection database)))))))
+
+(when (clsql-sys:database-type-library-loaded :postgresql-socket)
+ (clsql-sys:initialize-database-type :database-type :postgresql-socket))