[postmodern-devel] with-connection problem

Ryszard Szopa ryszard.szopa at gmail.com
Fri Aug 17 15:05:01 UTC 2007


On 8/17/07, Jens Teich <info at jensteich.de> wrote:
> What's wrong here? Tested with LW and SBCL.

> POMO> (with-connection ("web_access" "web_access" "***" "localhost")
>  (query (:select '* :from 'dokumente-files)))
> (("s5s732006l9t5i0ai3a308281gwdh5      " "z_z15p02"
>   "Bilddata/AZ/Pdf/Az15_16/baumuste" "pdf" 1914355)
>   ......
>
> POMO> (defparameter *db* '("web_access" "web_access" "***" "localhost"))
> *DB*
>
> POMO> (with-connection *db*
>  (query (:select '* :from 'dokumente-files)))
>
> error while parsing arguments to DEFMACRO WITH-CONNECTION:
>   bogus sublist
>     *DB*
>   to satisfy lambda-list
>     (DATABASE USER PASSWORD HOST &KEY (PORT 5432) POOLED-P)
>    [Condition of type SB-KERNEL::DEFMACRO-BOGUS-SUBLIST-ERROR]

Postmodern's macro WITH-CONNECTION expects its connection
specification argument to be an unquoted list (it doesn't evaluate
it). The easiest solution to your problem may be writing a macro
with-default-connection:

(defmacro with-default-connection (&body body)
  `(with-connection ("web_access" "web_access" "***" "localhost")
                    , at body))

Another possibility would be to change Postmodern's with-connection
and make it a macro interface to a function:

(defun with-connection-fun (connection-spec what-to-do)
  "Functional under the macro WITH-CONNECTION."
  (let ((postmodern:*database* (apply #'postmodern:connect connection-spec)))
    (unwind-protect (progn (funcall what-to-do))
      (postmodern:disconnect postmodern:*database*))))

;; This is postmodern's WITH-CONNECTION modified to use the functional
;; interface.
(defmacro with-connection ((database user password host &key (port
5432) pooled-p) &body body)
  "Binds *database* to a new connection and runs body in that scope."
  `(with-connection-fun '(,database ,user ,password ,host :port ,port
:pooled-p ,pooled-p)
    (lambda () (progn , at body))))

Then you can do something like (with-connection-fun *DB* (lambda ()
(query (:select '* :from 'dokumente-files)))) if you really want it.

This approach make also a lot easier writing custom with-*-connection
macros (like with-object-connection and so on).

Marijn: maybe you could consider changing Postmodern's with-connection
as I've described above?

Bests,

    -- Richard
-- 
http://szopa.tasak.gda.pl/



More information about the postmodern-devel mailing list