db.lisp
1 (defpackage ami.db 2 (:use :cl :bedrock) 3 (:export :connect)) 4 (in-package :ami.db) 5 6 (defparameter *connection-pool* '()) 7 (defvar *current-connection* nil) 8 9 (defun setup-connection-pool (&key (host "127.0.0.1") database-name (num-connections 20)) 10 (dotimes (i num-connections) 11 (let ((dbi:connect 12 (push (dbi:connect :postgres :host host :database-name database-name) *connection-pool*))) 13 14 (defun flush-connection-pool () 15 (dolist (conn *connection-pool*) 16 (dbi.driver:disconnect conn)) 17 (setf *connection-pool* nil)) 18 19 (defmacro with-conn ((conn-name) &body body) 20 `(let* ((,conn-name (pop ami.db::*connection-pool*))) 21 (unwind-protect 22 (progn ,@body) 23 (push ,conn-name ami.db::*connection-pool*)))) 24 25 (defmacro with-tx ((conn-name) &body body) 26 `(with-conn (,conn-name) 27 (handler-case 28 (progn 29 (dbi.driver:begin-transaction ,conn-name) 30 ,@body 31 (dbi.driver:commit ,conn-name) 32 (format T "after commit")) 33 (error () 34 (dbi.driver:rollback ,conn-name) 35 (format T "after rollback"))))) 36 37 (aif (pop *connection-pool*) 38 it 39 (error "No connections left"))) 40