Update of /project/pg/cvsroot/pg In directory clnet:/tmp/cvs-serv3433
Modified Files: README NEWS TODO sysdep.lisp Log Message: - on CL implementations that support Unix sockets, the HOST argument to PG-CONNECT may designate the directory containing the local PostgreSQL unix socket (often "/var/run/postgresql/"). The HOST argument is assumed to designate a local directory rather than a hostname when its first character is #/. You may need to modify authentication options in the PostgreSQL configuration file pg_hba.conf to allow connections over a unix-domain socket where the databse username is not equal to your ident tokens. This is an incompatible change to previous support for unix-domain sockets with CMUCL (previously a HOST of NIL told pg-dot-lisp to connect to a unix-domain socket whose name was hardwired into the library). This support currently exists for SBCL, CMUCL and OpenMCL.
--- /project/pg/cvsroot/pg/README 2006/09/18 19:09:25 1.8 +++ /project/pg/cvsroot/pg/README 2006/09/23 12:24:28 1.9 @@ -1,8 +1,7 @@ pg.lisp -- socket level interface to the PostgreSQL RDBMS for Common Lisp
Author: Eric Marsden eric.marsden@free.fr - Time-stamp: <2006-09-18 emarsden> - Version: 0.23 + Version: 0.24
Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006 Eric Marsden
@@ -54,12 +53,16 @@
(pg-connect dbname user &key password host port) -> connection Connect to the database DBNAME on HOST (defaults to localhost) at - PORT (defaults to 5432), and log in as USER. If HOST is nil, - attempt to connect to the localhost using a Unix domain socket; - otherwise the connection is established using TCP/IP. If the - database requires a password, send PASSWORD (as clear text unless - the backend demands crypt() authentication). Set the output date - type to 'ISO', and initialize our type parser tables. + PORT (defaults to 5432), and log in as USER. If HOST designates + an absolute pathname (its first character is #/), attempt to + connect to the localhost using a Unix domain socket that resides + in that directory (for example "/var/run/postgresql/"); otherwise + HOST designates a hostname and the connection is established + using TCP/IP. Connections to unix sockets are not supported on + all implementations. If the database requires a password, send + PASSWORD (as clear text unless the backend demands crypt() + authentication). Set the output date type to 'ISO', and + initialize our type parser tables.
(pg-exec connection &rest sql) -> pgresult Concatenate the SQL strings and send to the backend. Retrieve --- /project/pg/cvsroot/pg/NEWS 2004/08/11 13:26:41 1.3 +++ /project/pg/cvsroot/pg/NEWS 2006/09/23 12:24:28 1.4 @@ -1,5 +1,30 @@ +=== Version 0.22, 2006-09-23 ===========================================
-=== Version 0.21, 2003-xxxx ============================================ + - improved support for character encodings; see variable + *PG-CLIENT-ENCODING* (UTF8 encoding tested with SBCL and CLISP + with PostgreSQL 8.1). + + - fixes to the support for prepared statements (or "execution plans"; + see the README for details of the API) on the v3 frontend/backend + protocol. + + - on CL implementations that support Unix sockets, the HOST argument + to PG-CONNECT may designate the directory containing the local + PostgreSQL unix socket (often "/var/run/postgresql/"). The HOST + argument is assumed to designate a local directory rather than a + hostname when its first character is #/. You may need to modify + authentication options in the PostgreSQL configuration file + pg_hba.conf to allow connections over a unix-domain socket where + the databse username is not equal to your ident tokens. This is an + incompatible change to previous support for unix-domain sockets + with CMUCL (previously a HOST of NIL told pg-dot-lisp to connect + to a unix-domain socket whose name was hardwired into the library). + This support currently exists for SBCL, CMUCL and OpenMCL. + + - many other bugfixes + + +=== Version 0.21, 2003-05-05 ===========================================
- added support for the v3 frontend/backend protocol, used by PostgreSQL version 7.4 and up (thanks for Peter Van Eynde). --- /project/pg/cvsroot/pg/TODO 2004/08/11 13:26:41 1.2 +++ /project/pg/cvsroot/pg/TODO 2006/09/23 12:24:28 1.3 @@ -13,9 +13,6 @@ - in PG-CONNECT, use getaddrinfo_all() to try connecting to each possible address for a hostname
- - - the whole bind saga - - maybe use CancelRequest to back out of error with grace?
- we should return the oid of the object on inserts --- /project/pg/cvsroot/pg/sysdep.lisp 2006/09/18 21:33:10 1.14 +++ /project/pg/cvsroot/pg/sysdep.lisp 2006/09/23 12:24:28 1.15 @@ -1,16 +1,17 @@ ;;; sysdep.lisp -- system-dependent parts of pg-dot-lisp ;;; ;;; Author: Eric Marsden eric.marsden@free.fr -;;; Time-stamp: <2006-09-18 emarsden> +;;; Time-stamp: <2006-09-20 emarsden> ;; ;;
(in-package :postgresql)
-#+allegro (require :socket) -#+lispworks (require "comm") -#+cormanlisp (require :sockets) -#+armedbear (require :socket) +(eval-when (:compile-toplevel :load-toplevel :execute) + #+allegro (require :socket) + #+lispworks (require "comm") + #+cormanlisp (require :sockets) + #+armedbear (require :socket))
(defmacro %sysdep (desc &rest forms) @@ -88,18 +89,21 @@ #+cmu (defun socket-connect (port host) (declare (type integer port)) - (handler-case - (let ((fd (if host - (ext:connect-to-inet-socket host port) - (ext:connect-to-unix-socket - (format nil "/var/run/postgresql/.s.PGSQL.~D" port))))) - (sys:make-fd-stream fd :input t :output t - :element-type '(unsigned-byte 8))) - (error (e) - (error 'connection-failure - :host host - :port port - :transport-error e)))) + (let ((host (if (typep host 'pathname) + (namestring host) + host))) + (handler-case + (let ((fd (if (eql #/ (char host 0)) + (ext:connect-to-unix-socket + (format nil "~A.s.PGSQL.~D" (string host) port)) + (ext:connect-to-inet-socket host port)))) + (sys:make-fd-stream fd :input t :output t + :element-type '(unsigned-byte 8))) + (error (e) + (error 'connection-failure + :host host + :port port + :transport-error e)))))
;; this doesn't currently work, because WRITE-SEQUENCE is not ;; implemented @@ -129,22 +133,6 @@ (error 'connection-failure :host host :port port))))
-#+(and db-sockets broken) -(defun socket-connect (port host) - (declare (type integer port)) - (handler-case - (let ((s (sockets:make-inet-socket :stream :tcp)) - (num (car (sockets:host-ent-addresses - (sockets:get-host-by-name host))))) - (sockets:socket-connect s num port) - (sockets:socket-make-stream s :element-type '(unsigned-byte 8) - :input t :output t :buffering :none)) - (error (e) - (error 'connection-failure - :host host - :port port - :transport-error e)))) - #+sbcl (defun socket-connect (port host-name) (declare (type integer port)) @@ -193,6 +181,8 @@ (comm:open-tcp-stream host port :element-type '(unsigned-byte 8) :direction :io) + ;; note that Lispworks (at least 4.3) does not signal an error if + ;; the hostname cannot be resolved; it simply returns NIL (error (e) (error 'connection-failure :host host @@ -218,24 +208,27 @@ #+openmcl (defun socket-connect (port host) (declare (type integer port)) - (handler-case - (if host - (make-socket :address-family :internet - :type :stream - :connect :active - :format :binary - :remote-host host - :remote-port port) - (make-socket :address-family :file - :type :stream - :connect :active - :format :binary - :remote-filename (format nil "/var/run/postgresql/.s.PGSQL.~D" port))) - (error (e) - (error 'connection-failure - :host host - :port port - :transport-error e)))) + (let ((host (if (typep host 'pathname) + (namestring host) + host))) + (handler-case + (if (eql #/ (char host 0)) + (make-socket :address-family :file + :type :stream + :connect :active + :format :binary + :remote-filename (format nil "~A.s.PGSQL.~D" (string host) port)) + (make-socket :address-family :internet + :type :stream + :connect :active + :format :binary + :remote-host host + :remote-port port)) + (error (e) + (error 'connection-failure + :host host + :port port + :transport-error e)))))
;; from John DeSoi #+(and mcl (not openmcl)) @@ -325,7 +318,7 @@ (defvar *pg-client-encoding*)
(defun implementation-name-for-encoding (encoding) - (%sysdep "client encoding to external format name" + (%sysdep "convert from client encoding to external format name" #+(and clisp unicode) (cond ((string-equal encoding "SQL_ASCII") charset:ascii) ((string-equal encoding "LATIN1") charset:iso-8859-1) @@ -344,12 +337,12 @@ ((string-equal encoding "LATIN9") :latin9) ((string-equal encoding "UTF8") :utf8) (t (error "unknown encoding ~A" encoding))) - #+(or cmu gcl ecl abcl openmcl) + #+(or cmu gcl ecl abcl openmcl lispworks) nil))
(defun convert-string-to-bytes (string &optional (encoding *pg-client-encoding*)) (declare (type string string)) - (%sysdep "convert string to bytes" + (%sysdep "convert string to octet-array" #+(and clisp unicode) (ext:convert-string-to-bytes string (implementation-name-for-encoding encoding)) #+(and allegro ics) @@ -358,7 +351,7 @@ #+(and :sbcl :sb-unicode) (sb-ext:string-to-octets string :external-format (implementation-name-for-encoding encoding)) - #+(or cmu gcl ecl abcl openmcl) + #+(or cmu gcl ecl abcl openmcl lispworks) (if (member encoding '("SQL_ASCII" "LATIN1" "LATIN9") :test #'string-equal) (let ((octets (make-array (length string) :element-type '(unsigned-byte 8)))) (map-into octets #'char-code string)) @@ -376,7 +369,7 @@ ;; for implementations that have no support for character ;; encoding, we assume that the encoding is an octet-for-octet ;; encoding, and convert directly - #+(or cmu (and sbcl (not :sb-unicode)) gcl ecl abcl openmcl) + #+(or cmu (and sbcl (not :sb-unicode)) gcl ecl abcl openmcl lispworks) (let ((string (make-string (length bytes)))) (map-into string #'code-char bytes))))