src/middleware/db.lisp

DOWNLOAD
(defpackage murja.middleware.db
  (:use :cl :postmodern))

(in-package :murja.middleware.db)

(defun db-config () 
  (list :db (or (sb-ext:posix-getenv "MURJA_DB")
		"blogdb")
	:username (or (sb-ext:posix-getenv "MURJA_DB_USER")
		      "blogadmin")
	:password (or (sb-ext:posix-getenv "MURJA_DB_PASSWD")
		      "blog")
	:host (or (sb-ext:posix-getenv "MURJA_DB_HOST")
		  "localhost")
	:port (let ((port-str (sb-ext:posix-getenv "MURJA_DB_PORT")))
		 (if port-str
		     (parse-integer port-str)
		     5432))))

(defun @transaction (next)
  (destructuring-bind (&key db username password host port) (db-config)
    (handler-bind ((cl-postgres:database-socket-error
		     (lambda (c)
		       (format t "Socket error from db: ~a~%" c)
		       (setf (hunchentoot:return-code*) 500)
		       (return-from @transaction "Internal Server Error"))))
      (with-connection (list db username password host :port port)

	(with-schema (:blog :if-not-exist nil)
	  (handler-bind ((cl-postgres:database-error
			   (lambda (c)
			     (format t "Error from db: ~a~%" c)
			     (setf (hunchentoot:return-code*) 500)
			     (return-from @transaction "Internal Server Error"))))
	    (with-transaction ()
	      (funcall next))))))))